`
Anleb
  • 浏览: 32775 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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,变成了死循环。

2
3
分享到:
评论
2 楼 Anleb 2012-08-01  
tenderuser 写道
方法和变量都是对象,表示上也没有什么特殊的地方。。 。处理应该也是一样的把


有点区别,对于方法不说了,很简单,obj.method,obj是接受者,方法method发送消息告诉obj。

但是  顶级域调用 变量的时候,如果不加 接受者 如: ask (随意一个变量),默认是self,也就是main,系统会认为是一个 接受者是main的ask方法。


实例变量也是变量,他存在于对象中,但是实例变量没法从外部调用,只能依靠attr_accessor或者属性方法调用,实例方法存在于类中,就这点区别。
1 楼 tenderuser 2012-07-31  
方法和变量都是对象,表示上也没有什么特殊的地方。。 。处理应该也是一样的把

相关推荐

    ruby元编程之method_missing的一个使用细节

    ### Ruby元编程之method_missing的一个使用细节 #### 引言 在Ruby语言中,元编程是一种非常强大的功能,它允许程序在运行时修改自身的行为。其中`method_missing`方法是元编程的重要组成部分之一,用于处理未知的...

    Ruby元编程之梦中情人method_missing方法详解

    Ruby中的`method_missing`是元编程的一个核心特性,它允许你在类或模块中处理未定义的方法调用。当你尝试调用一个不存在的方法时,Ruby会默认抛出`NoMethodError`异常,但如果你定义了`method_missing`方法,它就会...

    ruby元编程.pdf

    Ruby元编程是Ruby编程语言中的一个重要特色,它指的是Ruby语言允许程序员在运行时对类、方法和变量等进行操作的能力。通过元编程,开发者可以编写出更加简洁、灵活和高效的代码。《Metaprogramming Ruby》这本书深入...

    Ruby元编程pdf

    `method_missing`是Ruby的一个特殊方法,当调用一个未定义的方法时,系统会自动调用它,允许开发者处理未知的方法调用。 3. **变量**:Ruby的变量可以在运行时被重新定义。全局变量、实例变量和类变量都可以动态...

    编程之魂:Ruby中的元编程艺术

    当尝试调用一个未定义的方法时,`method_missing` 将会被触发,从而允许程序员自定义相应的处理逻辑。 #### 代码示例 ```ruby class DynamicMethods def method_missing(method_name, *args, &block) if method_...

    元编程 Ruby

    Ruby中的每个类都拥有一个对应的元类(也称为eigenclass或singleton class),这是实现元编程的关键结构,因为元类允许我们在运行时给类动态地添加方法和属性。 Ruby的元编程能力在Rails框架中得到了广泛的应用。...

    ruby元编程之创建自己的动态方法

    `method_missing`是Ruby中的一个特殊方法,它在试图调用一个未定义的方法时被触发。这为开发者提供了一个机会,可以在运行时定义或处理这些方法的调用。这种机制非常适合于创建动态方法,即那些在编译时不存在但在...

    intro_to_metaprogramming:Ruby元编程简介

    我不知道是否一定要同意这一点,但是Ruby中的元编程是一个非常强大的工具,可以导致习惯性的Ruby。 对于Rails开发人员来说,即使您没有直接使用Ruby元编程,也可以通过使用Rails获得收益。 该研讨会由( 为“ 。 ...

    脚本编程之: ruby_bcyy_jb51.net

    标题中的“脚本编程之:ruby_bcyy_jb51.net”显然指的是一个关于Ruby编程语言的教程或者文章集合,可能是在jb51.net这个网站上发布或收集的。Ruby是一种面向对象的、动态类型的脚本语言,由日本人松本行弘(Yukihiro ...

    ruby metaprograming

    根据给定文件的信息,这里似乎存在一定的混淆,因为文件内容主要涉及的是IBM Lotus Domino 7邮件服务器的配置指南,而非“Ruby元编程”。不过,基于您的需求,我将重点围绕“Ruby元编程”这一主题来生成相关的知识点...

    Ruby 编程

    Ruby编程是一种高级、面向对象的脚本语言,以其简洁、优雅的语法和强大的元编程能力而受到程序员的喜爱。Ruby的设计理念强调代码的可读性和自然表达性,这使得它成为初学者入门的理想选择。"Ruby 编程"的资源特别...

    Ruby元编程技术详解(Ruby Metaprogramming techniques)

    在Ruby中,每个对象都有一个与之关联的单例类,这个类只包含该对象的实例方法。通过`class ; self; end`可以访问到对象的单例类,这对于在运行时添加或修改对象的方法非常有用。`Kernel#singleton_class`方法可以...

    Metaprogramming ruby

    其中,`method_missing`是一个特殊的方法,用于处理未定义的方法调用,是实现动态行为的重要工具。 3. **符号到方法转换(Symbol#to_proc)**:Ruby允许将符号转换为块(Proc对象),这样可以更简洁地编写代码。...

    Metaprogramming Ruby(Second Edition)

    《Metaprogramming Ruby(Second Edition)》是Ruby编程语言领域的一本经典著作,由Peter Eberhardt和Paolo Perrotta共同撰写。这本书详细介绍了如何利用Ruby的强大元编程特性来提升代码的灵活性、可扩展性和简洁性。...

    Ruby元编程的一些值得注意的地方

    `method_missing`是一个非常强大的特性,但它也可能引入难以预料的行为。如果误用了`method_missing`,可能会导致程序中的方法调用出现异常,甚至引发安全问题。因此,在可能的情况下,应优先考虑使用`delegate`或`...

    ruby官方chm文档

    理解如何使用`eval`、`class_eval`和`instance_eval`,以及如何利用`send`和`method_missing`进行消息传递,是提升Ruby编程技巧的关键。 《ruby23.chm》文档可能是整个Ruby语言的综合指南,可能包含前面几个文档的...

    MetaProgramming-Play:重写 Ruby 注入方法以了解元编程

    第 10 周:创客学院在 Ruby 中玩转元编程挑战: 使用method_missing重新定义对象在询问has_unknown_attribute时的Reacthas_unknown_attribute 。 使用define_method创建Ruby 内置attr_accessor方法的布尔版本。代码...

Global site tag (gtag.js) - Google Analytics