рубин и ссылки. Работа с фикснумами - PullRequest
2 голосов
/ 07 февраля 2012

Я немного знаю о рубиновом способе обработки объектов и ссылок. Заменить вещи, т. Д ...

Я знаю, что это не работает с fixnum, потому что var это fixnum. Но я хочу изменить значение fixnum внутри функции, и это значение изменилось в переменной ouside.

Как я могу это сделать?

Полагаю, я могу использовать строку типа "1", но она довольно грязная.

Ответы [ 3 ]

5 голосов
/ 07 февраля 2012

Ruby всегда будет передаваться по ссылке (потому что все является объектом), но в Fixnum отсутствуют какие-либо методы, позволяющие изменять значение.См. " void foo (int & x) -> Ruby? Передача целых чисел по ссылке? " для получения более подробной информации.

Вы можете либо вернуть значение, которое затем назначите своей переменной, например, так::

a = 5
def do_something(value)
    return 1 #this could be more complicated and depend on the value passed in
end
a = do_something(a)

или вы можете заключить свое значение в объект, такой как хэш, и обновить его таким образом.

a = {:value => 5}
def do_something(dict)
  dict[:value] = 1
end
do_something(a) #now a[:value] is 1 outside the function

Надеюсь, это поможет.

4 голосов
/ 08 февраля 2012

Вы можете передать массив с одним числом, например, [1], или хэш, например, {value: 1}. Менее уродлив, чем строка, так как само ваше число остается числом, но меньше накладных расходов, чем новый класс ...

2 голосов
/ 07 февраля 2012

Когда я создавал игру, у меня была та же проблема, что и у вас. Был числовой счет, который представлял, сколько зомби вы убили, и мне нужно было вручную синхронизировать его между игроком (который увеличивал счет), ScoreBar и ScoreScreen (который отображал счет). Решением, которое я нашел, было создание отдельного класса для оценки, который обернет значение и изменит его:

class Score
  def initialize(value = 0)
    @value = value
  end

  def increment
    @value += 1
  end

  def to_i
    @value
  end

  def to_s
    @value.to_s
  end
end
...