1

我有一个接受对象的方法,以及它需要应用于对象的转换器方法:

def f x, conv
  conv x
end

我将如何在字符串上调用它并to_f用作转换器?这不起作用:

f '123', &:to_f

编辑:这是一个人为的例子,我知道这可以简化或以不同的方式编写。

EDIT2:感谢那些建议使用块的人,这很有效。我试图找出这是否可以用方法来完成,比如函数式语言。

4

2 回答 2

2

您可以使用yield执行传递的过程:

def f(x)
  yield x
end

f(x) { |y| y.to_f }

或者,如果您希望将 proc 作为命名参数,您可以使用&

def f(x, &proc)
  proc.call x
end

你不能只传入任意函数,因为 ruby​​ 中只有实例方法,所以你不能这样做:

to_f.to_proc

要获得一个功能,如果你想这样做,你必须使用send

def g(x, sym)
  x.send sym
end

g(2, :to_f)

请记住,ruby 不是函数式语言,尽管它有很多函数式结构,但它是一种非常面向对象的语言。

于 2013-04-10T18:30:45.900 回答
0

您的方法必须接受一个块,您必须调用它:

def f x, &conv
  conv.call x
end

或者

def f x
  yield x
end

编辑: 您也可以将方法作为常规对象传递(您可以使用 获得一个"".method(:to_i)),但它们的行为就像 procs 并且不能self像绑定到对象时那样操作。

于 2013-04-10T18:29:01.120 回答