Невозможно изменить / заменить значения глобального хэша в Ruby - PullRequest
0 голосов
/ 25 февраля 2012

Я пишу простую текстовую игру для изучения рубина.Хеш должен быть глобальной переменной, так как я должен получить к ней доступ в других функциях (могут быть другие решения, но я мог бы найти это).Я пытаюсь изменить значения элементов хеша.Приведенная ниже функция в основном увеличивает текущую цену на 10%, и в ее текущей форме корректно изменяет значения и выводит их, но не записывает их в исходный хеш.

$stocks = {"DOHOL" => 10, "GOZDE" => 5, "KONYA" => 20}

def margin
  puts "New values:\n "
  $stocks.each do|key, value|
    percent = (value.to_i / 10) + 1
    change = rand(percent)
    value += change
    puts "#{key}: #{value} USD"
  end
end

Я, конечно, хотел бы сделатьэто случайное снижение / увеличение цены на 10%, но это еще одна проблема, которую я хотел бы решить самостоятельно, поэтому, пожалуйста, не комментируйте ее.Что еще более важно, у меня есть еще один вопрос о хэшах.Есть ли обязательство использовать ключ и значение, потому что в руководствах по поиску, я видел людей, использующих пары типа «имя, значение» или «человек, имя» вместо «ключ, значение», не определяя ничего.

Ответы [ 4 ]

1 голос
/ 25 февраля 2012

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

Помимо этого, я думаю, что вы хотите назначить другое значение для значений в вашем хэше. Вы можете достичь этого следующим образом:

    def margin(hash)
      hash.each do |stock, value|
        hash[stock] = random_stock_increase(value)
      end
    end

    def random_stock_increase(value)
      increase = rand((value.to_i / 10) + 1)
      value + increase
    end

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

0 голосов
/ 25 февраля 2012

В ответ на ваш второй вопрос вы можете использовать все, что вы хотите, в качестве «ключа» и «значения».Это локальные переменные в рамках каждого цикла.Однако, какие бы метки вы ни указали, они будут соответствовать «ключу» и «значению» хеша при итерации.Возможно, вам следует выбрать имена, которые имеют смысл для вашего цикла.

stocks = {"DOHOL" => 10, "GOZDE" => 5, "KONYA" => 20}
stocks.each do |name, price|
  stocks[name] = price * 2
end

в точности эквивалентно

stocks = {"DOHOL" => 10, "GOZDE" => 5, "KONYA" => 20}
stocks.each do |pirate, ninja|
  stocks[pirate] = ninja * 2
end

, но первое, безусловно, более понятно.

0 голосов
/ 25 февраля 2012

Вы можете вызывать ключи и значения в итераторе по своему усмотрению.Но здесь может быть неправильное понимание того, что является ключом и какова ценность вашего хэша.Вот почему редко используют другие имена для ключа и значения (даже я никогда не видел это).

0 голосов
/ 25 февраля 2012

Метод each из хэша даст вам две вещи для работы в блоке.Вам решать, как вы называете эти вещи, и вы определяете имена между ||.

Новые значения должны быть явно сохранены в хэше до конца блока:

$stocks[key] = value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...