实施例,
我将使用Rails ActiveRecord回调
before_validation :foobar
def foobar
logger.debug 'before validate'
end
如果我将方法作为symbol
发送,则此回调执行得很好。
我的问题是,这不是正常的情况!
Ruby不能将方法作为参数发送,除了block, Proc, lambda
,不是吗?
这对我来说是合理的。
before_validation -> {logger.debug 'before validate'}
但这怎么可能呢?
before_validation :foobar
所以我制作了自己的方法,与此相同。
do_something(:my_callback)
def do_something(my_callback)
my_callback
logger.debug "somesomesome"
end
def my_callback
logger.debug "calcalcalcal"
end
,结果是?
当然,这不起作用!
my_callback param只是一个简单的符号:(
答案 0 :(得分:3)
您应该使用Object#send
:
def do_something(my_callback)
send my_callback
end
或者如果你想让它更通用(所以你可以将参数/块传递给它:
def do_something(my_callback, *args, &block)
send my_callback, *args, &block
end
答案 1 :(得分:1)
符号很有用,因为给定的符号名称在整个Ruby程序中引用相同的对象。 在ruby中调用方法有三种方法:
1)点操作员
object = Object.new
puts object.object_id
#=> 282660
2)使用发送(API)
puts object.send(:object_id)
#=> 282660
3)使用method.call
puts object.method(:object_id).call
#=> 289744
因此,符号:object_id
也可以作为您方法的引用,例如:my_callback