2

たとえば、繰り返されるタスクを処理するために、関数内に小さなラムダを作成することがよくあります (不自然な例):

def some_method(foo)
  match = SOME_REGEX.match foo

  has_component = lambda { |name|
    match.names.include? name and not match[name].nil?
  }

  if has_component.call("street_name")
    # ...
  end

  if has_component.call("house_number")
    # ...
  end

  if has_component.call("entrance")
    # ...
  end

  # ...
end

今、私はあなたのことを知りませんが、むしろ書きたいと思います:

  if has_component "street_name"
    # ...
  end

  if has_component "house_number"
    # ...
  end

  if has_component "entrance"
    # ...
  end

私はRubyの内部動作に精通していませんが、ラムダ/プロシージャをdefined関数のように呼び出し可能にするためにできることはありますか?

クラス レベルでラムダ/プロシージャをメソッドとして定義したくない理由はいくつかあります。特に、呼び出し元のスコープにはアクセスできません。

4

3 に答える 3

2

次のこともできます。

has_component.('entrance')
于 2013-10-16T10:06:51.160 に答える
2

添字演算子を使用できます

if has_component['entrance']
于 2013-10-16T10:04:48.713 に答える
1

Ruby 1.9.0 から、次のシンタックス シュガーがありcallます。

b.call(1, 2, 3)
b.(1, 2, 3)

これは、だけでなく に応答するすべてのもので機能するため、推奨される方法です。callProc

または、より短いメソッド名を定義することもできます。

class Proc
  alias_method :c, :call
end

b.c(1, 2, 3)

またはさらに短いメソッド名:

class Proc
  alias_method :[], :call
end

c[1, 2, 3]

実際、後者は Ruby コア ライブラリで既に定義されています。

Procあいまいさがあるため、 s の呼び出しをメソッドの呼び出しのように見せることはできません: は「引数を指定してb(1, 2, 3)メソッドを呼び出す」ことを意味するのか、それとも「引数なしでメソッドを呼び出して (またはローカル変数を逆参照して)、返された byを引数で呼び出す」ことを意味するのかということです。 ? ECMAScript と Python では、括弧なしでメソッドを呼び出すことを許可しないため、これは機能します。したがって、このあいまいさは決して発生しません。b1, 2, 3bbProcb1, 2, 3

于 2013-10-17T00:19:15.890 に答える