我有一个接受对象的方法,以及它需要应用于对象的转换器方法:
def f x, conv
conv x
end
我将如何在字符串上调用它并to_f
用作转换器?这不起作用:
f '123', &:to_f
编辑:这是一个人为的例子,我知道这可以简化或以不同的方式编写。
EDIT2:感谢那些建议使用块的人,这很有效。我试图找出这是否可以用方法来完成,比如函数式语言。
我有一个接受对象的方法,以及它需要应用于对象的转换器方法:
def f x, conv
conv x
end
我将如何在字符串上调用它并to_f
用作转换器?这不起作用:
f '123', &:to_f
编辑:这是一个人为的例子,我知道这可以简化或以不同的方式编写。
EDIT2:感谢那些建议使用块的人,这很有效。我试图找出这是否可以用方法来完成,比如函数式语言。
您可以使用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 不是函数式语言,尽管它有很多函数式结构,但它是一种非常面向对象的语言。
您的方法必须接受一个块,您必须调用它:
def f x, &conv
conv.call x
end
或者
def f x
yield x
end
编辑:
您也可以将方法作为常规对象传递(您可以使用 获得一个"".method(:to_i)
),但它们的行为就像 procs 并且不能self
像绑定到对象时那样操作。