2017-08-02 2 views
0

私が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_aNoMethodError: 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がこれをどのように処理するのか誰にでも分かりますか?

ありがとうございます!

+1

括弧を見るとメソッドをルックアップするルビパーサーです。大文字小文字( '_whatever()')は最初の大文字を見て定数を検索し、変数を試してから、ヘビが見えるときにアーリー0でメソッドを呼び出しますケーシング。 – mudasobwa

+0

私はなぜdownvotes、これは洞察に満ちた興味深い質問のように思えるのだろうか... ... –

+1

かなり長い質問。あなたは最後の例までのすべてを削除することができます。 – Stefan

答えて

3

Rubyはこれをどのように解釈しますか?メソッドと定数をどのように区別しますか?

ルールは、ローカル変数とほぼ同じです。Rubyは定数ではないことが明らかでない限り、定数であると想定します。定数には引数がありません。定数には受信者がありません。 「正常な」行動を考える

FOO  # constant 
self.FOO # message send 
FOO() # message send 
FOO :bar # message send 

、一つは、あなたがメソッドを定義するときにRubyが名前の警告で文句を言うことを期待する、またはSyntaxErrorを上げるかもしれません。

なぜですか?メソッドを定義することは構文上完全に合法です(結局のところ、オブジェクト指向のすべてです)。Arrayは完全に合法的なRuby識別子です。

関連する問題