gpt4 book ai didi

ruby - 如何将 "+="转换为 ruby​​ 中的运算符

转载 作者:数据小太阳 更新时间:2023-10-29 08:30:29 24 4
gpt4 key购买 nike

我可以将 "+""-""/" 转换为运算符使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com