【问题标题】:Ruby returning from inside a method but outside a loopRuby 从方法内部但在循环外部返回
【发布时间】:2015-01-09 17:44:10
【问题描述】:

尝试运行此代码。

当 method1 运行时,哈希会返回两次,这意味着哈希会按照“puts method1().inspect”命令的预期返回和打印。

当方法 2 运行时,循环第二次退出,通过键入“no”或“n”,会打印一堆看似随机的数字,而不是可爱的哈希。这是为什么呢????

def method1

    loop do
        print "Item name: "
        item_name = gets.chomp

        print "How much? "
        quantity = gets.chomp.to_i

        hash = {"Item"=> item_name, "quantity"=> quantity}
        puts hash.inspect

        return hash
    end

end

puts method1().inspect


def method2

    loop do
        print "Item name: "
        item_name = gets.chomp

        print "How much? "
        quantity = gets.chomp.to_i

        hash = {"Item"=> item_name, "quantity"=> quantity}
        puts hash.inspect

        print "Add another item? "
        answer = gets.chomp.downcase
        break if (answer == "no") || (answer == "n")
    end

    return hash

end

puts method2().inspect

【问题讨论】:

  • hash 不是你想的那样;循环内的hash 仅对该块可见。如果你使用的变量名还不是方法,你会得到一个非常不同的结果:)
  • 也不是你问题的答案,只是一个说明。您的hash 变量将只保存最后一个结果,因为您在每个循环中使用hash = 覆盖它。看Hash#merge

标签: ruby loops methods return


【解决方案1】:

您无意中发现了Object#hash 方法。您没有在循环之外声明hash,因此它不在最后返回的范围内。相反,它返回 hash() 方法值,对于该实例来说这是一个很大的负数。

启动 irb,然后输入 hash,你会看到同样的东西:

(505)⚡️ irb
2.1.2 :001 > hash
 => -603961634927157790 

所以,试试这个:

def method2
    hash = {}
    loop do
        # ...

另外请注意,您并没有添加到哈希中,而是每次都在重新创建它。

【讨论】:

    【解决方案2】:

    method2 中,您试图返回超出范围的内容 (hash)。

    method1 中,当您返回它时,您仍处于定义hash 的循环中。在method2 中,您超出了定义hash 的范围,因此它具有未记录的结果。像这样重新定义method2

    def method2
        hash = nil
    
        loop do
            print "Item name: "
            item_name = gets.chomp
    
            print "How much? "
            quantity = gets.chomp.to_i
    
            hash = {"Item"=> item_name, "quantity"=> quantity}
            puts hash.inspect
    
            print "Add another item? "
            answer = gets.chomp.downcase
            break if (answer == "no") || (answer == "n")
        end
    
        return hash
    
    end
    

    现在,即使 hash 最初设置为 nil,它的范围也包括整个方法,并且该值将被保留。

    【讨论】:

    • 您可能希望修复此方法以实际附加到哈希,因为这似乎是 OP 想要的,但 OP 似乎误解了分配的工作原理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 2021-02-27
    相关资源
    最近更新 更多