zoukankan      html  css  js  c++  java
  • ruby元编程之 method_missing 一个细节

    我们知道顶级域,定义域的self是啥?
    puts self    #main
    puts self.class #Object
    

    我们知道当一个方法被调用的时候,如果没有对象接受,默认就是self,如:

    def tell_me_who
        puts self
    end
    tell_me_who  #main
    

     方法调用是这样的步骤,先查找当前对象的所在类的实例方法存在方法与否,如果存在,调用方法,如果不存在则查看superclass,直到 BasicObject都没找到对于方法的话,就会调用Kernel的method_missing()方法,并且报错,如

    Error:test.rb:8: undefine: undefined local variable or method `ask' for main:Object (NameError)
    

     注意报错的信息,我们可以发现,当我们调用一个不存在的变量的时候,也是会追溯到Kernel的method_missing方法的,这里要注意咯。

    验证:

    puts self    #main
    puts self.class #Object
    def self.method_missing(name,*arg)
        puts "#{name} is not exist!"
    end
    puts ask   #ask is not exist!
    

     一个案例导致BUG:

    def self.method_missing(name,*arg)
        1.times do 
            puts method_name=name
        end
        puts "#{method_name} is not exist!"
    end
    
    ask #变量或者方法
    

     意图:让任何未定义的变量或者方法,都打印一次
    可是,这是一个死循环?看出问题了吗
    ask被执行,可是没有定义ask,就会转到method_missing,
    method_name在times的block中,出了作用域了,所以又会执行method_missing,变成了死循环。

  • 相关阅读:
    771. Jewels and Stones
    706. Design HashMap
    811. Subdomain Visit Count
    733. Flood Fill
    117. Populating Next Right Pointers in Each Node II
    250. Count Univalue Subtrees
    94. Binary Tree Inorder Traversal
    116. Populating Next Right Pointers in Each Node
    285. Inorder Successor in BST
    292. Nim Game Java Solutin
  • 原文地址:https://www.cnblogs.com/IAmBetter/p/2963694.html
Copyright © 2011-2022 走看看