32

私は Ruby を初めて使用し、言語設計の原則のいくつかを理解しようとしています。私が正しく理解していれば、Ruby でのラムダ式の呼び出しには角括弧を使用する必要があり、「通常の」関数呼び出しには「通常の」/丸括弧を使用する必要があります。

構文が異なる特別な理由はありますか? または、言い換えれば、(なぜ) 呼び出し元は、関数を呼び出すか、ラムダ式を適用するかを認識する必要がありますか?

4

3 に答える 3

34

通常の Ruby メソッド呼び出し()では、ブロック用の中括弧を使用しません。[]ラムダの呼び出しが気に入らない場合は、いつでもcallメソッドを使用できます。

例:

>> by_two = lambda { |x| x * 2 } #=> #<Proc:0x0000000101304588@(irb):1>
>> by_two[5] #=> 10
>> by_two.call(5) #=> 10

編集

Rubyの新しいバージョンでも:

>> by_two.(5) #=> 10

だけを実行できない理由についてはby_two(5)、Ruby がベアワードを検出すると、最初にそれをローカル変数として解決しようとし、それが失敗した場合はメソッドとして解決しようとします。

于 2011-06-14T13:00:39.333 に答える
30

Ruby では、メソッドは (たとえば JavaScript のように) ラムダ式ではないためです。

メソッドは常にオブジェクトに属し、(サブクラス化またはミックスインによって) 継承でき、オブジェクトの固有クラスで上書きでき、ブロック (ラムダ) を与えることができます。変数には独自のスコープがあります。メソッド定義の例:

a = :some_variable
def some_method
  # do something, but not possible to access local variable a
end

# call with:
some_method

ただし、ラムダ/プロシージャは単純なクロージャーであり、変数に格納される可能性があります-他には何もありません:

a = :some_variable
some_lambda = lambda{
  # do something, access local variable a if you want to
}

# call with:
some_lambda[]

Ruby は両方のアプローチを強力な構文 (ブロックの受け渡しなど) と組み合わせます。

def some_method_with_block(a)
  # do something, call given block (which is a lambda) with:
  yield(a) ? 42 : 21
end

# example call:
some_method_with_block(1) do |x|
  x.odd?
end #=> 42
于 2011-06-14T13:22:17.567 に答える
13

ブラケットが必要な場合は、次のことができます

by_two = lambda { |x| x * 2 }
by_two.(5) # => 10

.と の間by_twoに注意してください(5)

于 2011-06-14T23:40:44.177 に答える