【问题标题】:Undefined local variable or method for a Hash for main:Object (NameError) [duplicate]main:Object(NameError)的散列的未定义局部变量或方法[重复]
【发布时间】:2015-11-12 05:58:44
【问题描述】:

所以我有一个名为 pushups 的哈希,我在我创建的另一个方法之外定义了它:

pushups = {"2015-04-16-10:05:01" => 25, "2015-04-10-10:05:01" => 150, "2015-04-11-10:05:01" => 99 }

但是,当我在上面的哈希上运行下面的方法时,我收到以下错误:

ma​​in:Object (NameError) 的未定义局部变量或方法“pushups”

基本上,我只想转换上面散列中的所有键,并将其打印在具有相同值的更新散列中,甚至只是作为所有更新键的新数组。

 def convert_dates(timestamp)

     pushups.each do |timestamp, numberOfPushups|
     date = DateTime.strptime(timestamp, "%Y-%m-%d-%H:%M:%S")
     end

     print date

 end

我认为我已经充分定义并初始化了哈希。所以我不确定这是否是问题所在。这里似乎有什么问题?

【问题讨论】:

  • 当代码中的变量为pullups 时,为什么会收到pushups 的错误?您是复制粘贴错误还是在此处手动输入?请分享正确的信息。
  • 抱歉错字!我修好了。
  • 如果您只想打印日期:require 'date'; p pushups.map { |timestamp,_| DateTime.strptime(timestamp, "%Y-%m-%d-%H:%M:%S") }。您的代码加载了错误。我很抱歉,但我现在没有时间去处理它。也许其他人可以发布一个答案来识别错误并向您展示如何修复它们。不要太沮丧,我们大多数人在第一次学习 Ruby 时都会遇到类似的问题。

标签: ruby hash


【解决方案1】:

如果您尝试使用闭包,那么,使用def 定义的函数不支持闭包行为 - 它不会记住绑定在其定义之外的变量。

在您的情况下,您可以将变量 pushups 更改为 @pushups 以使其成为实例变量。

或者,您可能必须使用 lambda 或等效项。下面显示了一个简化示例,显示了如何在 lambda 中访问 pushups

示例代码

pushups = {"2015-04-16-10:05:01" => 25, "2015-04-10-10:05:01" => 150, "2015-04-11-10:05:01" => 99 }

l = ->(timestamp) do 
    p pushups 
end

l.call ("2015-04-16-10:05:01")

输出

{"2015-04-16-10:05:01"=>25, "2015-04-10-10:05:01"=>150, "2015-04-11-10:05:01"=>99}

参考:https://softwareengineering.stackexchange.com/questions/180579/what-is-a-closure-and-how-is-it-implemented-in-ruby

【讨论】:

  • 当我使用与上面相同的过程但使用此 lambda 运行上述代码时,我仍然得到“未定义的局部变量或方法 `timestamp' for main:Object (NameError)”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-19
  • 1970-01-01
  • 2016-02-14
  • 2016-04-08
相关资源
最近更新 更多