【问题标题】:Mutating variable with function (Ruby beginner)用函数改变变量(Ruby初学者)
【发布时间】:2011-11-01 10:21:51
【问题描述】:

如何在 Ruby 中为此进行突变:

row = row.to_hash

我试过 row.to_hash!

但它不起作用。

编辑:这是它所在的代码:

    CSV.foreach('stores.csv', :headers => true) do |row|
      row = row.to_hash
    end

【问题讨论】:

  • 这还不够短吗?状态的就地突变可能不值得节省输入的 4 个左右字符。
  • 您的问题还不清楚。 row 是哪个类的成员?你到底想达到什么目的?如果您可以给出行的示例值,然后解释您希望生成的哈希看起来像什么,这将有所帮助。此外,像这样改变变量类型通常会影响代码的易读性和可维护性;无论如何,将哈希分配给新变量可能是更好的风格。
  • @AdamSpiers:更新了示例代码。
  • @MichaelKohl:这不仅仅是因为它足够短——我想看看 Ruby 是如何完成突变的。
  • 我认为这是一个相当合理的问题。提问者清楚地表明他或她是初学者,并且在某些情况下隐藏突变是有根本原因的。讨论这些原因是为了更多地了解该语言是很有趣的。

标签: ruby-on-rails ruby ruby-on-rails-3


【解决方案1】:

除非我误解了你的问题,你可以试试:

rows = []
CSV.foreach('stores.csv', :headers => true) do |row|
  rows << row.to_hash
end

它实际上并不是突变,但它确实为您提供了您似乎正在寻找的输出。使用不同的方法来执行新输出与更改数据的操作的原因之一是,通常让您的输入数据不可变更为明智。从 CSV 文件中读取可能不完全符合这个范例(原始输入在某个文件中),这可能就是为什么没有 ! to_hash 的版本。

在我上面的代码中,您可以选择处理散列并将结果放在您想要的位置,如果输入文件是巨大的以节省空间,而不是仅仅将所有散列推入数组然后处理该数组。

【讨论】:

    【解决方案2】:

    我们实际上不能说是否有这样的方法。但如果您收到NoMethodError,很可能没有。 :)

    【讨论】:

    • 确实是一个rails函数。 Here
    • 嗯,这是来自FlashHash 类。我不认为你正在使用那个。
    • 我什至不知道你现在的陈述是什么。你能澄清一下吗?
    • 它使用标题行将 csv 文件中的行转换为哈希。它内置于 Rails 3.1
    猜你喜欢
    • 2013-02-07
    • 1970-01-01
    • 2016-10-13
    • 2013-11-10
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    相关资源
    最近更新 更多