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は実行時に呼び出し、エラーが起こるのか。