私がRubyでコーディングしているときに、型チェックとrespond_to?
とnil
のチェックを避けるために、私はしばしばオブジェクトを期待した型に強制します。 Array
が必要な場合は、foo.nil? ? handle_nil(foo) : handle_array(foo)
の代わりに、handle_foo(foo.to_a)
からnil.to_a # => []
までのほうが好きです。Kernel#Array - 定数と同じ名前のメソッドをRubyがどのように解釈しますか?
これはすべてでは機能しません。1.to_a
はNoMethodError: undefined method 'to_a' for 1:Integer
になります。 1.to_ary
は同じエラーを発生させます。 Array()
は、どのようなオブジェクトでも見えるものを扱い、賢明な変換をArray
にするか、または[]
にラップするかのいずれかの問題を解決しているようです。
Array(nil) # => []
Array('') # => [""]
Array(Class) # => [Class]
Array(1) # => [1]
Array(Object.new) # => [#<Object:0x007fdbd40df4c8>]
Array({}) # => []
Array(foo: :bar) # => [[:foo, :bar]]
他のクラスでも同じことができます。 String()
、Float()
...私は珍しい構文を考えずにたくさん使っていました。実装についてもっと知りたかったのです。 #[]
に似た特別な方法のための構文的砂糖ですか?
これらの両方を使用すると、メソッドを使用するようにあなたがArray()
を使用SyntaxError
def self.(foo)
puts foo
end
def self.()(foo)
puts foo
end
を上げます。 Kernel
のドキュメントを見ると、そのことが明らかになります。あなたが期待として、次の作品:
class Thing
attr_accessor :name
def initialize(name)
@name = name
end
end
module Kernel
def Thing(name)
Thing.new(name)
end
end
thing = Thing('name') # => #<Thing:0x007fefef89d8e8 @name="name">
thing.name # => "name"
あなたはまた、この
HI = 'hi'.freeze
def HI(word)
word
end
HI # => "hi"
HI("ho") # => "ho"
を行うことができます私の質問は:どのようにRubyはこれを解釈していますか?メソッドと定数をどのように区別しますか?これは愚かな質問ですか? 「通常の」振る舞いを考えると、あなたがメソッドを定義するときにRubyが名前の警告を出すか、SyntaxError
を呼び出すと予想されるかもしれません。 Rubyがこれをどのように処理するのか誰にでも分かりますか?
ありがとうございます!
括弧を見るとメソッドをルックアップするルビパーサーです。大文字小文字( '_whatever()')は最初の大文字を見て定数を検索し、変数を試してから、ヘビが見えるときにアーリー0でメソッドを呼び出しますケーシング。 – mudasobwa
私はなぜdownvotes、これは洞察に満ちた興味深い質問のように思えるのだろうか... ... –
かなり長い質問。あなたは最後の例までのすべてを削除することができます。 – Stefan