【问题标题】:When can I safely call send method on objects in Ruby?我什么时候可以安全地调用 Ruby 中对象的 send 方法?
【发布时间】:2013-11-19 12:40:19
【问题描述】:

我知道在对象上调用public_send 而不是send 是一个好习惯,以免无意中调用私有方法。但是,如果我知道我将调用的方法肯定是公开的,我可以使用 send 吗?我写了这段代码:

[:name, :artist, :album,].each do |attribute|
  define_method "#{attribute}s" do
    @songs.map { |song| song.public_send(attribute) }.uniq
  end
end

如果我在这里用send 替换public_send 会被认为是不好的做法吗?

【问题讨论】:

  • send 别名为__send__ 在网上有很多关于此的信息。 link
  • @songs.map(&attribute).uniq 呢?
  • @Stefan,这确实是更好的版本。 Danke 目录 :)

标签: ruby syntax coding-style


【解决方案1】:

TLDR;

调用 send 很好,它在你的类中。

完整说明

Alex,这就是我一直以来对这种策略的看法。我相信这很符合社区的要求。

Ruby Docs 这么说发送:

调用由符号标识的方法,将任何指定的参数传递给它。如果名称 send 与 obj 中的现有方法发生冲突,您可以使用 __send__

这是世界上任何人都可以访问的公共方法。这意味着任何使用您的代码的人都可以随时调用私有函数!

因此...您不应该像在其他语言中那样考虑公共和私有功能。我会争辩你稍微改变你的定义。

Public:经过充分测试、稳健、经过错误检查的功能,被全世界推荐使用。

Private: 辅助函数可以接受无效输入并破坏事物。

我对此没有什么大的理由,只是对这些概念在 Ruby 中如何工作的总体印象。

对于您的具体问题,重要的是要记住您是编写此代码的人,并且我假设您的代码在您创建的类中。在那种情况下,我一直使用send!它比public_send 更短,我很清楚我在叫什么!

你会想把它记录得足够好,这样任何在你身后的人都会知道要小心什么。

【讨论】:

【解决方案2】:

在可能的情况下始终使用public_send 并避免使用send,它会减少您的表面积,总体而言是一种更好的做法。

String.new.public_send("sleep") # error
String.new.send("sleep") # hangs

在上面的示例中,将public_send 替换为send 很好,但是如果重构了东西怎么办?更好地建立一种做法,使您暴露的长期风险最少。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-06
    • 2016-03-03
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 2014-04-13
    • 2010-09-08
    相关资源
    最近更新 更多