如何在Ruby中发送符号作为方法?

时间:2015-01-13 12:40:52

标签: ruby-on-rails ruby

实施例,

我将使用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只是一个简单的符号:(

2 个答案:

答案 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