`
Goldice
  • 浏览: 107819 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Ruby Metaprogramming

阅读更多

Ruby使用者对attr_accessor一定不会陌生。

 

class A
         attr_accessor :num
end

等效于:

class A
         def num
               @num
         end

         def =(value)
               @num = value
         end
end

在类的定义中,attr_accessor定义了num的读写方法,只用了一行代码就生成了两个实例方法,很cool,不是嘛?。这就是Metaprogramming,用程序来编写程序。

 

Ruby中到底是用了什么trick能实现Metaprogramming这样cool的功能呢?

我们把attr_accessor当做一个method,那么调用attr_accessor的是self,这个self是class A,也就是说,attr_accessor是一个类方法。按照这个思路,我们可以这样写:

 

 

class A
        def self.log s
                attr_reader s
                define_method("#{s}=") do |val|
                        instance_variable_set("@#{s}",val)
                end 
        end 


        log "num"
end

a=A.new
a.num = 10
puts a.num

在这里,使用attr_reader来定义实例变量的读方法,define_method来定义实例变量的写方法。

 

使用attr_reader或者自定义的log可以用于扩展代码,我们可以将它们称为macros.

 

使用上面这段代码,并没有体现出Metaprogramming的威力,因为在class A中直接定义方法,要比你定义一个类方法简单明了。但是如果是这样:

 

 

class B < A
     log "bnum"
end

b = B.new
b.bnum = 11
puts b.bnum # => 11

 我们就可以从A中直接继承log方法,来轻松构建B中的实例读写方法的了!这里的log,是不是很类似attr_accessor呢?

 

 

到目前为止,我们通过定义类方法,来实现继承类的Metaprogramming的方法。可是,有些时候,我们并不想通过继承的方式来获得元编程的能力,如果所有类想获得某种元编程的方法只能通过继承类的方式来实现,那太麻烦了吧!这个时候,module出现了。

 

 

module A
        def log s
                attr_reader s
                define_method("#{s}=") do |val|
                        instance_variable_set("@#{s}",val)
                end 
        end 
end

class B 
         extend A
         log "bnum"
end

b=B.new
b.bnum = 11
puts b.bnum

体会一下module和extend的作用,easy,不是嘛?

 

如果对于一个module,级想包含其中的instance method,又想包含其中的class method,肿么办?这个时候,就要来一点trick了。

 

module A
        module ClassMethod
                def log s
                        attr_reader s
                        define_method("#{s}=") do |val|
                                instance_variable_set("@#{s}",val)
                        end 
                end 
        end 

        def log
                puts "Just a instance method"
        end 

        def self.included(hostclass)
                hostclass.extend ClassMethod
        end 
end

class B 
         include A
         log "bnum"
end

b = B.new
b.log
b.bnum = 10
puts b.bnum
 

 

 

 

0
0
分享到:
评论

相关推荐

    ruby metaprogramming examples

    从给定的文件信息来看,虽然没有提供直接的内容,但是从标题和描述中可以得知,我们需要讨论的主题是Ruby的元编程(metaprogramming)示例。元编程是指程序有能力在运行时生成、修改或执行代码的能力。Ruby是一种...

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

    Ruby元编程是一种强大的编程技术,它允许程序员在运行时修改和扩展程序的行为。元编程在Ruby中被广泛使用,因为Ruby的语言设计鼓励动态性和灵活性。以下是一些关于Ruby元编程的关键知识点: 1. 单例类(Singleton ...

    Ruby元编程 源代码 Metaprogramming Ruby source code

    这本《Metaprogramming Ruby》书籍深入探讨了如何利用Ruby的特性进行元编程,帮助开发者提升代码的灵活性、可扩展性和复用性。源代码提供了书中各个示例的实践,让读者能够更好地理解元编程的概念。 元编程的核心...

    Metaprogramming.Ruby

    ### Metaprogramming Ruby:掌握如专业人士般的编程技巧 #### 一、引言 《Metaprogramming Ruby: Programming Like the Ruby Pros》是一本深入探讨Ruby元编程技术的专业书籍,作者Paolo Perrotta通过丰富的实例和...

    patch_def_ruby_Metaprogramming_Before_

    "patch_def_ruby_Metaprogramming_Before_" 的标题暗示了我们将在讨论如何利用元编程技术来添加在方法之前的钩子,比如 `def_before`。这种技术常用于在原有方法执行之前插入额外的功能,例如日志记录、验证或其他...

    label_break_ruby_Metaprogramming_

    在Ruby编程语言中,元编程(Metaprogramming)是一种强大的特性,允许程序在运行时检查、修改甚至创建自身的结构和行为。元编程能够增加代码的灵活性和可扩展性,但同时也需要谨慎使用,以避免过度复杂化和降低代码...

    Metaprogramming Ruby 2nd Edition ruby元编程

    ### Metaprogramming Ruby 2nd Edition:深入理解Ruby元编程 #### 一、书籍简介与价值 《Metaprogramming Ruby 2nd Edition》是一本深入探讨Ruby语言元编程特性的经典之作。本书不仅适合那些希望深入了解Ruby内部...

    Metaprogramming Ruby 2(Pragmatic,2014)

    Dig under the surface and explore Ruby's most advanced feature: a collection of techniques and tricks known as metaprogramming. In this book, you'll learn metaprogramming as an essential component of ...

    Metaprogramming Ruby

    ### Metaprogramming Ruby:深入理解动态编程的力量 #### 标题解读 “Metaprogramming Ruby”这一标题明确地指出了本书的核心内容——通过元编程技术深入探索Ruby语言的独特魅力。元编程(Metaprogramming)是一种...

    Metaprogramming ruby

    《Metaprogramming Ruby》是一本专注于Ruby编程语言元编程技术的书籍,由Paolo Perrotta撰写。元编程是一种编程范式,它允许在程序运行时修改或创建程序结构和行为。在Ruby中,元编程是其核心特性之一,使得代码能够...

    Metaprogramming Ruby(Second Edition)

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

    MetaprogrammingRuby2ndEditionFreePdfBook.pdf 英文原版

    Metaprogramming Ruby 2nd Edition – FreePdfBook

    MetaProgramming in Ruby系列教程的中译版

    MetaProgramming in Ruby系列教程的中译版。 uby是动态的、魔幻而有趣的。而元编程(Metaprogramming)技术在Ruby中的应用也让我大开眼界,虽然以前也有浅显地介绍反射机制(Reflection),但我仍然觉得才疏学浅,不...

    Pragmatic.Metaprogramming.Ruby.Feb.2010.rar

    Pragmatic.Metaprogramming.Ruby.Feb.2010.rar

    Ruby Under a Microscope

    ruby interpreter 原理探討 At first glance, learning how to ... using metaprogramming, Ruby programs can inspect and change themselves. Beneath this thin veneer of simplicity, Ruby is a very complex tool.

    MetaprogrammingRubyFreePdfBook.pdf 英文原版

    Metaprogramming Ruby – FreePdfBook

    Server Metaprogramming Ruby-Pyton-Groovy-Haskell-Erlang.pdf

    总之,《Server Metaprogramming Ruby-Pyton-Groovy-Haskell-Erlang.pdf》这本书不仅介绍了元编程的基本概念,还深入探讨了五种具有代表性的动态语言在服务器端元编程方面的应用,并通过《Beyond Java》一书提供了对...

    ruby books

    进阶读者可以阅读《Programming Ruby》(又名"The Pickaxe Book”),这是Ruby的权威参考,或者《Metaprogramming Ruby》来探索Ruby的元编程特性。而对于Web开发,经典之作《Agile Web Development with Rails》是...

    Pragmatic Metaprogramming Ruby.Feb.2010.rar

    Rubyinheritscharacteristicsfromvariouslanguages—Lisp,Small talk,C,andPerl,tonameafew.MetaprogrammingcomesfromLisp (andSmalltalk).It’sabitlikemagic,whichmakessomethingastonish ingpossible....

Global site tag (gtag.js) - Google Analytics