我什么时候可以安全地调用 Ruby 中对象的 send 方法?

Ale*_*pov 4 ruby syntax coding-style

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
Run Code Online (Sandbox Code Playgroud)

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

Sam*_*ron 5

尽可能使用public_send并避免send它会减少您的表面积,总体来说是更好的做法。

String.new.public_send("sleep") # error
Run Code Online (Sandbox Code Playgroud)
String.new.send("sleep") # hangs
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,用 替换public_sendsend可以了,但是如果东西被重构了怎么办?更好地建立一种将长期风险降至最低的做法。