web-dev-qa-db-ja.com

ラムダの呼び出し/適用と関数呼び出し-Rubyの構文は異なります。なぜですか?

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

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

31
BreakPhreak

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
28
J-_-L

通常の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がベアワードを見つけると、最初にローカル変数として解決しようとし、それがメソッドとして失敗した場合。

32
Michael Kohl

ブラケットが必要な場合は、

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

. の間に by_twoおよび(5)

11
Andrew Grimm