0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ダックタイピング

Posted at

Rubyは動的型付け言語なのでそんな機能はありません。

静的型付け言語

実行前にそのメソッドが100%確実に呼び出せることを保証しようとします。そのため、コンパイル時にオブジェクトのデータ型をチェックし、特定のクラスを継承していたり、特定のインターフェースを実装していたりすればメソッドの呼び出しは可能、そうでなければNG、と判断します。

動的型付け言語

実行時にそのメソッドが呼び出せるかどうかを判断し、呼び出せないときにエラーが起きます。

Rubyで気をつけること

Rubyが気にするのは「コードを実行するその瞬間に、そのメソッドが呼び出せるか否か」であって、「そのオブジェクトのクラス(データ型)が何か」ではありません

オブジェクトのクラスが何であろうと呼び出せるプログラム ダッグタイピング

irb(main):001* def display_name(object)
irb(main):002*   puts "Name is <<#{object.name}>>"
irb(main):003> end
=> :display_name
irb(main):004* class User
irb(main):005*   def name
irb(main):006*     'alice'
irb(main):007*   end
irb(main):008> end
=> :name
irb(main):009* class Product
irb(main):010*   def name
irb(main):011*     'A great movie'
irb(main):012*   end
irb(main):013> end
=> :name
irb(main):014> user = User.new
=> #<User:0x000000010c05f930>
irb(main):015> display_name(user)
Name is <<alice>>
=> nil
irb(main):016> user.name
=> "alice"
irb(main):017> display_name(user)
Name is <<alice>>
=> nil
irb(main):018> product = Product.new
=> #<Product:0x000000010c37d810>
irb(main):019> display_name(product)
Name is <<A great movie>>
=> nil

Rubyが気にするのはstock?メソッドを呼び出せるか?

irb(main):001* class Product
irb(main):002*   def initialize(name, price)
irb(main):003*     @name = name
irb(main):004*     @price = price
irb(main):005*   end
irb(main):006*
irb(main):007*   def display_text
irb(main):008*     stock = stock? ? "アリ": "ナシ"
irb(main):009*     "商品名: #{@name} 価格: #{@price}円 在庫:#{stock}"
irb(main):010*   end
irb(main):011> end
=> :display_text
irb(main):012* class DVD < Product
irb(main):013*   def stock?
irb(main):014*     true
irb(main):015*   end
irb(main):016> end
=> :stock?
irb(main):017> product = Product.new("A great film", 1000)
=> #<Product:0x000000010de25c58 @name="A great film", @price=1000>
irb(main):018> product.display_text
(irb):8:in `display_text': undefined method `stock?' for #<Product:0x000000010de25c58 @name="A great film", @price=1000> (NoMethodError)
...
irb(main):019> dvd = DVD.new("An awesome film", 3000)
=> #<DVD:0x000000010e0953a8 @name="An awesome film", @price=3000>
irb(main):020> dvd.display_text
=> "商品名: An awesome film 価格: 3000円 在庫:アリ"

知らない人に対しては具体的なエラーメッセージが出るようにする

irb(main):001* class Product
irb(main):002*   def initialize(name, price)
irb(main):003*     @name = name
irb(main):004*     @price = price
irb(main):005*   end
irb(main):006*
irb(main):007*   def display_text
irb(main):008*     stock = stock? ? "アリ": "ナシ"
irb(main):009*     "商品名: #{@name} 価格: #{@price}円 在庫:#{stock}"
irb(main):010*   end
irb(main):011*
irb(main):012*   def stock?
irb(main):013*     raise 'Must implement stock? in subclass.'
irb(main):014*   end
irb(main):015> end
=> :stock?
irb(main):016> product = Product.new("A great film", 1000)
=> #<Product:0x0000000112d52010 @name="A great film", @price=1000>
irb(main):017> product.display_text
(irb):13:in `stock?': Must implement stock? in subclass. (RuntimeError)

動的型付け言語はダックタイピングなどを使うと強力になる

動的型付け言語は事前に実行可能なコードかどうかを検証しないため、当然ながら実行して初めてエラーに遭遇する、ということが起こりえます。一方でその特性を利点を見なし、ダックタイピングなどのテクニックを使って非常に柔軟で強力なプログラムを書くこともできます.

感想

rubyは実行時に呼び出し、エラーが起こるのか。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?