在 Ruby 中使用动态变量从方法中删除 eval

Remove eval from method using dynamic variables in Ruby

向以下方法传递了一个 :symbol,它与通过 attr_accessor :symbol 设置的方法名称和实例变量相关联。我能够完成这项工作的唯一方法是通过 eval。有解决办法吗?

def collection_exists?(event_list)
  return unless self.class.method_defined?(event_list)
  eval("self.#{event_list.to_s}").any?
end

你可以利用public_send

  def collection_exists?(event_list)
    send(event_list).any?
  end

您可以使用以下选项之一:

  1. Object#method:

    method(event_list.to_sym).call.any?
    
  2. Object#public_send

    public_send(event_list.to_sym).any?
    

请注意,使用 public_sendsend 更安全,因为后者不关心方法的可见性并且可以使用 protectedprivate 方法顺利,而 public_send (正如你从它的名字猜到的那样)会在你尝试用它调用非 public 方法时引发。

另请注意,您不需要 self 来读取值,它是隐式的。