【问题标题】:Remove eval from method using dynamic variables in Ruby在 Ruby 中使用动态变量从方法中删除 eval
【发布时间】:2017-03-09 08:56:06
【问题描述】:

以下方法被传递了一个: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

【问题讨论】:

  • 您的问题不清楚:您说有一个符号“与方法名称和实例变量相关”,但 如何 它“与它们相关” ?另外,这个问题与ruby-on-railsrubocop有什么关系?
  • 您已经看到@Jörg 的问题。你怎么还没回答?
  • 请阅读下面的主题,我们已经解决了这个问题。 Rubocop 标记 eval,这是在 rails 应用程序中。
  • 当有效问题没有得到回答时,它不会被忽视。除此之外,回答问题只是普通的礼貌。不要忘记,为了让 Ruby 通知成员有评论留给他们,评论必须包含成员的用户名(或它的缩写形式),前面有一个&符号(例如,@JörgWMittag)。
  • 我了解@CarySwoveland,如果您查看线程,请明确我们中有 3 个人在下面合作。做出这种假设很容易,但实际上很容易看到这样的事情落入了裂缝。我正在努力首先解决答案。

标签: ruby-on-rails ruby eval rubocop


【解决方案1】:

您可以使用public_send

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

【讨论】:

  • 请不要使用send 调用公共方法。请改用public_send
  • 它不是一个公共方法,它是一个实例变量?你原来的帖子是 send(event_list).any?
  • @mudasobwa 它既是方法名称又是实例变量名称。想法?
  • @DeepakMahakale 同样,这里的想法是,自我在发送之前是多余的,并通过 rubocop 标记...
  • @chrishough 仅供参考:由于 ruby​​ 对名称的限制,不能在方法名称和实例变量名称之间共享相同的名称。
【解决方案2】:

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

  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(就像你一样) d 猜测它的名字)如果你尝试用它调用非public 方法会引发。

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

【讨论】:

  • 它用于方法名称和实例变量名称,如下所述。想法?
  • @chrishough 唯一的想法是没有“方法名和实例变量”之类的东西
  • @chrishough 没有问题。确保浏览我链接的文档;)
  • 我说错了,它只是一个实例变量,而不是一个方法。所以符号将是:shipment_event_list 和 self.shipment_event_list,我的错误,想法?
  • @chrishough 我看到你接受了答案。你编辑了它。你对它的编辑意味着你没有读过一个既不接受也不接受我的词。嗯……:\
猜你喜欢
  • 2011-12-27
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 2016-08-31
  • 2013-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多