2

我经常在我的函数中创建小的 lambdas 来处理重复的任务,例如(人为的例子):

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 的内部工作原理,但是我可以用我的 lambda/proc 做些什么来让它像defined 函数一样可调用?

我不想在类级别将 lambda/proc 定义为方法的原因有很多。除其他外,它无法访问调用者的范围。

4

3 回答 3

2

您可以使用下标运算符

if has_component['entrance']
于 2013-10-16T10:04:48.713 回答
2

你也可以这样做:

has_component.('entrance')
于 2013-10-16T10:06:51.160 回答
1

从 Ruby 1.9.0 开始,有以下语法糖call

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

这是首选方式,因为它适用于响应的所有内容call,而不仅仅是Procs。

或者,您可以只定义一个较短的方法名称:

class Proc
  alias_method :c, :call
end

b.c(1, 2, 3)

或者更短的方法名称:

class Proc
  alias_method :[], :call
end

c[1, 2, 3]

而事实上,后者已经在 Ruby 核心库中定义了。

不可能让 callingProc看起来像调用方法,因为存在歧义:是b(1, 2, 3)指“b带参数调用方法1, 2, 3”还是“不b带参数调用方法(或取消引用局部变量b)并调用带参数Proc返回的方法” ? 在 ECMAScript 和 Python 中,这是可行的,因为它们根本不允许调用没有括号的方法,所以这种歧义永远不会出现。b1, 2, 3

于 2013-10-17T00:19:15.890 回答