【问题标题】:Having trouble calling a Proc within a Method within a Class在类中的方法中调用 Proc 时遇到问题
【发布时间】:2015-06-15 22:02:28
【问题描述】:

我正在努力调试我的问题;我正在尝试在一个方法中使用 Proc,所有这些都在一个类中。当我不输入“类”详细信息时,我的程序编译得很好;但是,当我指定类名时,会出现各种不同的错误。

注意:我在 CodeReview.StackExchange.com 上发布了这个问题,但它在那里是题外话; mods(?)建议我在这里问这个问题。

背景。这是给我的提示,直接取自pine.fm

祖父时钟。编写一个方法,该方法接受一个块,并在今天过去的每个小时调用一次。那样的话,如果我要通过这个街区,一定会发出“叮!”的声音。最后,它会(有点)像落地钟一样响起。用几个不同的块来测试你的方法(包括我刚刚给你的那个)。提示:您可以使用Time.now.hour 获取当前小时。但是,这会返回 0 到 23 之间的数字,因此您必须更改这些数字才能获得普通的钟面数字(1 到 12)。

有效的代码:

def hourlyRing ring
    time = Time.now.hour%12;
    hour_set =[12, 1, 2, 3, 4, 5, 6, 7, 8 , 9 , 10, 11];
    (hour_set[time].to_i).times do 
        ring.call
    end
end

ring = Proc.new do 
    puts 'DING!'
end 

hourlyRing ring

它产生以下(正确,因为这里是下午 4 点)输出:

~$ ruby GrandfatherClock.rb
DING!
DING!
DING!
DING!

不起作用的代码:

class GrandfatherClock  

    def hourlyRing ring
        time = Time.now.hour%12;
        hour_set =[12, 1, 2, 3, 4, 5, 6, 7, 8 , 9 , 10, 11];
        (hour_set[time].to_i).times do 
            ring.call
        end
    end

    ring = Proc.new do 
        puts 'DING!'
    end 
end

# Here's where I try to call it:
ringtime = GrandfatherClock.new
ringtime.hourlyRing ring

任何人都可以看到我的代码中的错误吗?在我看来,这是一个足够短的代码,但我不明白为什么它不能编译。也许我从根本上误解了关于 Procs 的一些东西,但我不明白到底是什么。提前谢谢你。

【问题讨论】:

    标签: ruby proc


    【解决方案1】:

    这是关于上下文的。
    在第二个示例中,您将 ring proc 放入类中,因此当您实际调用 ringtime.hourlyRing ring 时,该范围内未定义 ring。

    您可以将代码更改为:

    class GrandfatherClock  
    
        def hourlyRing ring
            time = Time.now.hour%12;
            hour_set =[12, 1, 2, 3, 4, 5, 6, 7, 8 , 9 , 10, 11];
            (hour_set[time].to_i).times do 
                ring.call
            end
        end
    end
    
    ring = Proc.new do 
       puts 'DING!'
    end 
    
    # Here's where I try to call it:
    ringtime = GrandfatherClock.new
    ringtime.hourlyRing ring
    

    此外,问题陈述明确询问您有关块的问题, 所以 hourlyRing 应该是这样的:

    def hourlyRing
        time = Time.now.hour%12;
        hour_set =[12, 1, 2, 3, 4, 5, 6, 7, 8 , 9 , 10, 11];
        (hour_set[time].to_i).times do 
            yield
        end
    end
    

    你可以这样称呼它:

    hourlyRing { puts 'RING'}
    

     hourlyRing do
        puts 'RING'
     end
    

    【讨论】:

      【解决方案2】:

      在第一个示例中,您已将 proc 分配给类外部的变量 ring,因此当您引用它时,变量 ring 在范围内(即可见)。

      在第二个示例中,尽管您仍将 proc 分配给名为 ring 的变量,但该变量现在在 GrandfatherClock 类中声明,因此在该类之外不再可见。

      您可以创建一个返回 proc 的函数,而不是将 proc 分配给变量:

      class GrandfatherClock
          def hourlyRing ring
              time = Time.now.hour % 12
              hour_set = [12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
              (hour_set[time].to_i).times do
                  ring.call
              end
          end
      
          def ring
              Proc.new do
                  puts 'DING!'
              end
          end
      end
      
      # Here's where I try to call it:
      ringtime = GrandfatherClock.new
      ringtime.hourlyRing ringtime.ring
      

      请注意,您现在必须通过类的 ringtime 实例引用 ring

      但是,这并不是问题描述所要求的(我只是用它来说明发生了什么)。为了更符合问题描述,您需要在hourlyRing 函数中使用yield 代替ring.call,然后在方法调用中传递一个块:

      ringtime.hourlyRing do
          puts 'DING!'
      end
      

      【讨论】:

        猜你喜欢
        • 2019-09-18
        • 2015-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多