我可以转换"+","-"或"/"运营商使用2.send("-",3)
但它不起作用 "+="
a = 2
a += 2 #=> 4
a = 2
a.send("+=", 4) #=> NoMethodError: undefined method `+=' for 2:Fixnum
Run Code Online (Sandbox Code Playgroud)
我试图先转换符号; 但也行不通;
怎么解决这个问题?
2.send("-", 3)工作,因为-是一个方法,并2响应该方法:
2.respond_to?('-') #=> true
Run Code Online (Sandbox Code Playgroud)
=而+=另一方面不是方法:
2.respond_to?('=') #=> false
2.respond_to?('+=') #=> false
Run Code Online (Sandbox Code Playgroud)
即使=是有效的方法1,那么
a = 2
a.send("=", 4)
Run Code Online (Sandbox Code Playgroud)
相当于:
2.send("=", 4)
Run Code Online (Sandbox Code Playgroud)
或者干脆:
2 = 4
Run Code Online (Sandbox Code Playgroud)
换句话说:它将重新定义2为4Ruby不允许你做的事情.
这是因为变量(a如上所述)不是对象.a.send不向变量发送消息a,而是向对象发送消息a(2在示例中).
这同样适用于缩写分配,例如+=:
a = 2
a += 2
Run Code Online (Sandbox Code Playgroud)
相当于:
a = 2
a = a + 2
Run Code Online (Sandbox Code Playgroud)
您可以将其重写为:
a = 2
a = a.send("+", 2)
Run Code Online (Sandbox Code Playgroud)
赋值不是方法调用的一部分.
1您可以=通过define_method以下方式实际定义方法:
class Foo
define_method('=') { |other| puts "`=' called with #{other}" }
end
Run Code Online (Sandbox Code Playgroud)
但这只是一种普通的方法.特别是,它不会也不能改变对象被赋予的变量或对象的标识:
f = Foo.new
#=> #<Foo:0x007ff20c0eeda8>
f.send('=', 123)
# `=' called with 123
#=> nil
f
#=> #<Foo:0x007ff20c0eeda8>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
807 次 |
| 最近记录: |