如何在不创建新对象实例的情况下将整数变量增加X.

时间:2010-11-23 12:59:51

标签: ruby

如何在不创建新对象实例的情况下将整数变量增加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

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的更多用途。