如何在不创建新对象实例的情况下将整数变量增加X?
+=
不起作用,因为:
ree-1.8.7-2010.02 > x = 1
1
ree-1.8.7-2010.02 > x.object_id
3
ree-1.8.7-2010.02 > x += 1
2
ree-1.8.7-2010.02 > x.object_id
5
答案 0 :(得分:2)
你做不到。不是在Ruby中,也不是我所知道的任何其他编程语言。
表示数学数字1
的对象总是的值为1
。将表示数学数字1
的对象突变为突然具有值2
将非常简单,因为现在突然1 + 1 == 4
。
答案 1 :(得分:2)
暂时扩展您的示例。试试这个:
x = 2
y = 1 + 1
x.object_id
y.object_id
每个唯一号码都有自己的标识。 Ruby的面向对象比你在C ++和Java中找到的要深一些(这两者都有基元和类的概念)。
重要的是,当您第二次查询x
其值时,该值将是您所期望的。除非你是垃圾收集器,否则对象标识符并不重要。
答案 2 :(得分:0)
Bignum
s
begin
a = 1234567890
puts a.object_id
b = 1234567890
puts b.object_id
end
给了我
10605136
10604960
答案 3 :(得分:0)
即使只组织一个简单的循环,执行时间也非常糟糕。不应该从Ruby中抛弃基元。
(1..16000).each do
(1..16000).each do
end
end
这本身需要30-40秒才能完成(联想T400,Virtualboxed Ubuntu),你甚至没有做过复杂的事情。
答案 4 :(得分:0)
您可以使用辅助类:
class Variable
def initialize value = nil
@value = value
end
attr_accessor :value
def method_missing *args, &blk
@value.send(*args, &blk)
end
def to_s
@value.to_s
end
# here's the increment/decrement part
def inc x = 1
@value += x
end
def dec x = 1
@value -= x
end
end
x = Variable.new 1
puts x #=> 1
puts x.object_id #=> 22456116 (or whatever)
x.inc
puts x #=> 2
puts x.object_id #=> 22456116
x.inc 3
puts x #=> 5
puts x.object_id #=> 22456116
“类变量”here的更多用途。