Ruby发送没有符号

vis*_*ise 2 ruby send

可以不向对象发送任何内容吗?

让我详细说明一下.例如,我可以这样:

val = some_stack.include?(some_val) ? some_val : nil

obj1.obj2.send(val).obj3.obj4
Run Code Online (Sandbox Code Playgroud)

上面的调用不起作用,因为nil不是符号.所以解决方案是:

if val.nil?
  obj1.obj2.obj3.obj4
else
  obj1.obj2.send(val).obj3.obj4
end
Run Code Online (Sandbox Code Playgroud)

但是我不太喜欢这个.还有其他方法吗?

Mar*_*off 5

我不知道任何方法在self没有任何参数的情况下返回(但我可能会忽略某些东西),但是没有理由你不能将一个方法打包到你正在使用的类中:

irb(main)> class Object
irb(main)>   def ignore
irb(main)>     self
irb(main)>   end
irb(main)> end
=> nil
irb(main)> msg = nil
=> nil
irb(main)> 'hi'.send(msg || :ignore).upcase
=> "HI"
irb(main)> msg = :reverse
=> :reverse
irb(main)> 'hi'.send(msg || :ignore).upcase
=> "IH"
Run Code Online (Sandbox Code Playgroud)

  • 从Ruby 2.2开始,你可以使用`Kernel #self`,所以不再需要补丁. (2认同)