Как увеличить переменную Integer на X без создания нового экземпляра объекта - PullRequest
3 голосов
/ 23 ноября 2010

Как я могу увеличить переменную Integer на 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 ]

2 голосов
/ 23 ноября 2010

Продлите ваш пример на мгновение.Попробуйте это:

x = 2
y = 1 + 1

x.object_id
y.object_id

Каждый уникальный номер будет иметь свою индивидуальность.Объектная ориентированность Ruby идет немного глубже, чем вы найдете в C ++ и Java (оба имеют концепцию примитивов и классов).

Важно то, что когда вы запрашиваете x второй раз для его значение значение будет тем, что вы ожидаете.Идентификаторы объектов на самом деле не имеют значения, если вы не сборщик мусора.

2 голосов
/ 23 ноября 2010

Вы не можете.Не на Ruby и не на любом другом языке программирования, который мне известен.

Объект, представляющий математическое число 1, будет всегда иметь значение 1.Мутирование объекта, который представляет математическое число 1, чтобы внезапно иметь значение 2, было бы просто безумным, потому что теперь внезапно 1 + 1 == 4.

0 голосов
/ 28 марта 2011

Вы можете использовать вспомогательный класс:

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

Больше вариантов использования "Переменная класса" здесь .

0 голосов
/ 19 января 2011

Время выполнения действительно ужасно, даже если вы просто организуете простой цикл.Примитивы не должны быть исключены из Ruby.

(1..16000).each do
  (1..16000).each do
  end
end

Это само по себе занимает 30-40 секунд для завершения (Lenovo T400, Virtualboxed Ubuntu), и вы даже не сделали что-то сложное.

0 голосов
/ 24 ноября 2010

Хуже с Bignum с

begin
  a = 1234567890
  puts a.object_id
  b = 1234567890
  puts b.object_id
end

дал мне

10605136
10604960
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...