【问题标题】:Ruby - function changes hash but not integer variableRuby - 函数更改哈希但不是整数变量
【发布时间】:2018-08-26 09:19:49
【问题描述】:

我有一个函数,它接受一些参数,包括哈希和整数变量,并调整它们的值。该函数会更改要再次使用的哈希值,但整数变量会自行重置。我相信这是因为它正在更改该变量的副本,但我想知道如何完全更改它。我一直在阅读有关 proc 的内容,但不幸的是我似乎无法解决我的问题。

我的代码如下:

def buyProducts(product, amount, balance, foods, myProducts)
    totalPrice = foods[product] * amount
    balance -= totalPrice
    myProducts[product] = amount

    puts "You bought some #{product}\n"
    puts "Your remaining balance is $#{balance}\n"
    puts "Your current inventory is #{myProducts}"
end

这里,myProducts 是一个每次更新的哈希值。但是余额不是,从一开始就设置为100。虽然“您的余额”这一行确实会更新,但当再次调用该函数时,它会重置为 100。

感谢这是一个简单的问题,但我们将不胜感激!

【问题讨论】:

  • 你所问的是不可能的。 Ruby 是按值传递的,不可能在调用者的范围内更改变量的绑定。 Ruby 中没有传递引用。我怀疑这是X-Y-question,而您实际上不是在寻找传递引用。
  • buyProducts 用作某种“购物车”对象上的方法会更惯用,然后myProductstotalPrice 将是实例变量,balance 将是另一个“帐户”或“信用卡”对象中的实例变量。结果看起来更像 Ruby,让您的问题消失,并且您不会有一个带有五个位置参数的方法。

标签: ruby proc lexical-scope


【解决方案1】:

这是关键区别:您重新分配 [局部变量] balance,而不是 myProducts。相反,您只需更改 myProducts 的状态。这就是为什么这些更改在方法的调用中“存在”的原因:对象是相同的,只是包含不同的内容。

这对于整数是不可能的,因为每个整数都是它自己的对象并且没有任何可变状态。

您的方法必须将更改传达给外部状态,例如,返回 balance 的新值(然后调用者负责跟踪/应用新值)。或者你可以设置一个实例变量。

【讨论】:

  • 好的,谢谢。我已经返回了 balance 的值,然后稍后更改了我的公式以更改似乎正在工作的变量。谢谢你的解释!
猜你喜欢
  • 1970-01-01
  • 2013-08-22
  • 2013-04-18
  • 2021-04-21
  • 2014-05-29
  • 2011-12-07
  • 2017-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多