在 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
您可以使用以下选项之一:
-
method(event_list.to_sym).call.any?
-
public_send(event_list.to_sym).any?
请注意,使用 public_send
比 send
更安全,因为后者不关心方法的可见性并且可以使用 protected
和 private
方法顺利,而 public_send
(正如你从它的名字猜到的那样)会在你尝试用它调用非 public
方法时引发。
另请注意,您不需要 self
来读取值,它是隐式的。
向以下方法传递了一个 :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
您可以使用以下选项之一:
-
method(event_list.to_sym).call.any?
-
public_send(event_list.to_sym).any?
请注意,使用 public_send
比 send
更安全,因为后者不关心方法的可见性并且可以使用 protected
和 private
方法顺利,而 public_send
(正如你从它的名字猜到的那样)会在你尝试用它调用非 public
方法时引发。
另请注意,您不需要 self
来读取值,它是隐式的。