10サイコロの結果を含むベクトルが必要です(たとえば)。私はこれを行うことができます。`:rand`をmap/collectで単項メソッドとして使うにはどうしたらいいですか?
([6]*10).map{|x|rand(x)}
をしかし、これは私に「間違った数の引数」を与えるエラー:
([6]*10).map(:rand)
map
にrand
の1引数バージョンを渡す時点フリーの方法があります?
10サイコロの結果を含むベクトルが必要です(たとえば)。私はこれを行うことができます。`:rand`をmap/collectで単項メソッドとして使うにはどうしたらいいですか?
([6]*10).map{|x|rand(x)}
をしかし、これは私に「間違った数の引数」を与えるエラー:
([6]*10).map(:rand)
map
にrand
の1引数バージョンを渡す時点フリーの方法があります?
これは動作します:
([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
何度も何度も繰り返しています。
作品この「一種の」、6
はInteger
あるので、Integer
はrand
を定義Kernel
をミックスObject
の間接的なサブクラスです。しかし! rand
はprivate
です。つまり、明示的な受信者なしでのみ呼び出すことができます。 Method#to_proc
は、メソッドにすべての引数を渡すのに対しても、あなたは(
0と1の間
Float
である、それは
public
たとしても、あなたが引数なし
rand
の振る舞いを取得したいので、任意の引数を渡していません結局のところ、その受信機は既に結ばれているので)、この場合、それは
self.rand(6)
と続きます。 self
はObject
であり、Object
はKernel
であり、rand
はKernel
で定義されているため、どちらが効果的ですか。
これは、同様に動作しません。
([6]*10).map(:rand)
map
がパラメータを持っていませんが、引数を渡しているという単純な理由のために。
あなたは書くことができます。
([6]*10).map(&method(:rand))
これはそれを書くためにきれいな方法のようになります。それをこのように書く
10.times.map { rand(6) }
は、それが簡単にrand
に渡される引数は何を参照することができます。
はい、ありがとうございますが、私はそれを認識しています。実際のアプリケーションでは、すべてのサイコロが同じ数の辺を持つわけではないので、私は実際にベクトル上に 'rand 'をマップする必要があります。しかし、私はその問題にその問題に取り掛かりたくはありませんでした。 – rici
すばらしい、ありがとう。私は多くの場合、他の人に言い聞かせるように、十分な情報がないところで結論に飛び乗るべきではありません:-(私にはうまくいきます。私にはちょっとしたようですが、すべての言語に独自のイディオムがあります。 – rici
技術的には、OPの場合、OPは単純にシンボルを 'map'に渡しており、' map'はブロック以外の引数を受け付けませんので、何も呼び出していません。 "プライベートメソッド' rand'は6を求めました:Fixnum " – engineersmnky
@engineersmnky:ああ、そうです。OPが投稿した内容が意味をなさないため、私の心は自動的に'& 'で埋められました。 –