Ruby不保存/存储值

时间:2013-12-20 18:51:07

标签: ruby methods global-variables ruby-1.8.7

我的问题是chips没有保存为传递参数的全局变量。我正在通过$h1c (这是玩家的第一手筹码总数)。因此,如果他赢或输,则chips应设置为chips +- betamount

问题是它没有被保存为全局变量。如果我要写$h1c = 150_000,那就等于那。如果稍后我写$h1c = 150_000 + 50_000,那么200_000将是$ h1c的新值。

由于某些原因,当我声明chips = chips + betamount时,这不起作用,这与说$h1c = $h1c + $h1bet相同。

def review(hand, chips, betamount)  
  abc = valueofcards(hand)   #player's hand value
  klm = valueofcards($handD)  #dealer's hand value
    if abc == klm and abc < 19
      puts "You tied"
      chips = chips
    elsif abc > 18
      puts "You lost"
      chips = chips - betamount
    elsif abc < 19 and klm > 18
      puts "You won"
      chips = chips + betamount
    elsif abc < 19 and abc > klm
      puts "You won"
      chips = chips + betamount
    elsif abc < 19 and klm < 19 and klm > abc
      puts "You lost"
      chips = chips - betamount
    end
end

这是我通过审查的论点:

def pre_review(num)
  puts "Recap of that round"
  puts "First Hand:"
  review($hand1, $h1c, $h1bet)
  muckcards(num)
end

如果需要,这里是完整代码/游戏的链接来测试问题http://labs.codecademy.com/Bmvl#:workspace 注意:我目前只是试图让这部分为$ hand1工作,所以您可以选择1来播放手数来重现此问题。

3 个答案:

答案 0 :(得分:1)

Ruby是一种按值传递的语言,而不是传递引用。因此,您无法重新分配传递给该方法内的方法的变量的值。查看关于evaluation strategy的维基百科文章,了解有关变量传递的不同方法的信息。

Ruby是按值传递的事实稍微复杂b / c Ruby实际上是按值传递对象的引用。因此,您可以修改方法内部哈希的内容,并将这些更改反映在外部变量中。 Java也按值传递引用,我总是喜欢this关于它的文章,你可能会觉得它很有用。

答案 1 :(得分:1)

执行此操作时:

review($hand1, $h1c, $h1bet)

这不会将全局变量$h1c本身传递给方法,而是传递(引用)其

review方法中,传递的值名为chips,该方法是本地方法的本地名称。当您分配到chips时,您只需更新名称chips以引用其他值。

要获得所需的行为,您需要直接分配到$h1c而不是chips。 (或者,更好的编程实践,您可以从方法返回chips的值,而不是使用全局变量。)

答案 2 :(得分:1)

它不一样。前缀为$的变量是全局变量,而无前缀变量是本地变量。因此,当您更改$h1c的值时,您将更改在程序中其他位置引用的相同$h1c变量的值。但是,当您更改chips的值时,您只需在chips方法的上下文中更改review的值。只要该方法返回,chips的值就会丢失。

所以最简单的解决方案就是不要将参数传递给该方法,只是让它直接读取全局变量的值。就风格而言,这可能不是最好的解决方案。实际上,通常使用全局变量被认为是不好的做法。

另一个解决方案是从评论方法中返回玩家筹码的新值,如下所示:

def review(hand, chips, betamount)  
  abc = valueofcards(hand)   #player's hand value
  klm = valueofcards($handD)  #dealer's hand value
    if abc == klm and abc < 19
      puts "You tied"
      chips = chips
    elsif abc > 18
      puts "You lost"
      chips = chips - betamount
    elsif abc < 19 and klm > 18
      puts "You won"
      chips = chips + betamount
    elsif abc < 19 and abc > klm
      puts "You won"
      chips = chips + betamount
    elsif abc < 19 and klm < 19 and klm > abc
      puts "You lost"
      chips = chips - betamount
    end
    return chips # See here
end

然后,从方法外设置玩家筹码的值:

def pre_review(num)
  puts "Recap of that round"
  puts "First Hand:"
  $h1c = review($hand1, $h1c, $h1bet) # Like this
  muckcards(num)
end

在代码质量和编程风格方面可能还有很多工作可以用来修复该程序,但我现在还没有进入这个目标。保持学习! ; - )