作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
4 a = 2 a.send("+=", 4) #=-6ren">
我可以将 "+"
, "-"
或 "/"
转换为运算符使用 2.send("- ",3)
但它不适用于 "+="
a = 2
a += 2 #=> 4
a = 2
a.send("+=", 4) #=> NoMethodError: undefined method `+=' for 2:Fixnum
我尝试先转换符号;但也行不通;
如何解决这个问题?
最佳答案
2.send("-", 3)
有效,因为 -
是一种方法并且 2
响应该方法:
2.respond_to?('-') #=> true
另一方面,
=
和 +=
不是方法:
2.respond_to?('=') #=> false
2.respond_to?('+=') #=> false
即使 =
是一个有效的方法1,那么
a = 2
a.send("=", 4)
相当于:
2.send("=", 4)
或者简单地说:
2 = 4
换句话说:它会将 2
重新定义为 4
,而 Ruby 不允许您这样做。
这是因为变量(如上面的 a
)不是对象。 a.send
不会向变量 a
发送消息,而是向对象发送消息,a
指的是 (2
在示例中)。
同样适用于abbreviated assignment像 +=
:
a = 2
a += 2
相当于:
a = 2
a = a + 2
您可以将其重写为:
a = 2
a = a.send("+", 2)
赋值不是方法调用的一部分。
1 你实际上可以通过define_method
定义一个方法=
:
class Foo
define_method('=') { |other| puts "`=' called with #{other}" }
end
但这只是一个普通的方法。特别是,它不会也不能改变对象被分配给的变量或对象的身份:
f = Foo.new
#=> #<Foo:0x007ff20c0eeda8>
f.send('=', 123)
# `=' called with 123
#=> nil
f
#=> #<Foo:0x007ff20c0eeda8>
关于ruby - 如何将 "+="转换为 ruby 中的运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39608461/
我是一名优秀的程序员,十分优秀!