如何指定要作为参数传递的方法?

时间:2013-04-10 18:22:33

标签: ruby

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

def f x, conv
  conv x
end

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

f '123', &:to_f

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

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

2 个答案:

答案 0 :(得分:2)

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

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不是一种函数式语言,即使它有很多功能结构,它也是一种非常面向对象的语言。

答案 1 :(得分:0)

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

def f x, &conv
  conv.call x
end

def f x
  yield x
end

修改 你也可以将方法作为常规对象传递(你得到一个"".method(:to_i)),但它们的行为就像procs一样,并且不能像绑定到对象时那样在self上运行。