2016-09-22 3 views

答えて

6

これは動作します:

([6]*10).map(&method(:rand)) 

これません。

([6]*10).map(&:rand) 

Symbol#to_procは(おおよそ)のように実装されています

class Symbol 
    def to_proc 
    -> *args { args.first.public_send(self, *args.drop(1)) } 
    end 
end 

つまり、最初の引数は受信者、その他の引数はSymbolという名前のメソッドの引数になります。あなたのケースでは、それは呼び出しています

6.rand 

何度も何度も繰り返しています。

作品この「一種の」、6Integerあるので、Integerrandを定義KernelをミックスObjectの間接的なサブクラスです。しかし! randprivateです。つまり、明示的な受信者なしでのみ呼び出すことができます。 Method#to_procは、メソッドにすべての引数を渡すのに対しても、あなたは(

0と1の間 Floatである、それは publicたとしても、あなたが引数なし randの振る舞いを取得したいので、任意の引数を渡していません結局のところ、その受信機は既に結ばれているので)、この場合、それは

self.rand(6) 

と続きます。 selfObjectであり、ObjectKernelであり、randKernelで定義されているため、どちらが効果的ですか。

これは、同様に動作しません。

([6]*10).map(:rand) 

mapがパラメータを持っていませんが、引数を渡しているという単純な理由のために。

+0

すばらしい、ありがとう。私は多くの場合、他の人に言い聞かせるように、十分な情報がないところで結論に飛び乗るべきではありません:-(私にはうまくいきます。私にはちょっとしたようですが、すべての言語に独自のイディオムがあります。 – rici

+1

技術的には、OPの場合、OPは単純にシンボルを 'map'に渡しており、' map'はブロック以外の引数を受け付けませんので、何も呼び出していません。 "プライベートメソッド' rand'は6を求めました:Fixnum " – engineersmnky

+1

@engineersmnky:ああ、そうです。OPが投稿した内容が意味をなさないため、私の心は自動的に'& 'で埋められました。 –

3

あなたは書くことができます。

([6]*10).map(&method(:rand)) 
0

これはそれを書くためにきれいな方法のようになります。それをこのように書く

10.times.map { rand(6) } 

は、それが簡単にrandに渡される引数は何を参照することができます。

+0

はい、ありがとうございますが、私はそれを認識しています。実際のアプリケーションでは、すべてのサイコロが同じ数の辺を持つわけではないので、私は実際にベクトル上に 'rand 'をマップする必要があります。しかし、私はその問題にその問題に取り掛かりたくはありませんでした。 – rici

関連する問題