2012-04-26 137 views
0

下面的“疯狂性”是否有实际应用?信任刚刚返回的对象?

看起来这是ted总是能够自己重返世界,人们会认为他们在谈论到ted他们希望采取行动以一定的方式和达到一定年龄谁的方式......但他并不是他描绘自己的方式,而是对某人的年龄撒谎。

什么“挂羊头卖狗肉”是可能的,当返回一个对象,你检查什么对象代表并能......但是真的那么对象是行使职权的其他方式能够其它的东西,然后返回。

class Person 

    def age 
    21 
    end 

    def who_am_i? 
    puts "I am #{self}/#{object_id} and I am #{age} years old" 
    self 
    end 
end 


ted = Person.new 

def ted.singleton_who_am_i?  

    class << self 
     def age 
     0 
     end 
    end 

    puts "I am #{self}/#{object_id} and I am #{age} years old" 
    self 
end 

puts ted.who_am_i? == ted.singleton_who_am_i? 



>> I am #<Person:0x100138340>/2148123040 and I am 21 years old 
>> I am #<Person:0x100138340>/2148123040 and I am 0 years old 
>> true 

回答

0

http://andrzejonsoftware.blogspot.ca/2011/02/dci-and-rails.html

在DCI

,你的数据模型获取基于它用它的上下文不同类型的行为。通常它是用object.extend完成的,但它几乎就是你上面正在做的 - 利用元类。

另一个例子(也可能是为什么事情工作的方式)是班红宝石的工作方式。如果你说

class Foo 
end 

是同样的事情说

Foo = Class.new 
end 

这意味着你正在做的是在恒定分配Class类的新实例。当你在这个类上定义一个方法时,你不希望它应用到类的所有实例上,你只希望它在你定义的类上。所以,当你说

class Foo 
    def self.bar 
    end 
end 

它是完全相同的事情的话

class Foo 
end 

def Foo.bar 
end 

而这正是因为你在谈论你的问题相同的主要

(抱歉,如果说不清楚)

0

Ruby是一个非常有活力的语言,让你在运行时将代码注入对象。它有一些很好的用途,但它也可能使代码非常难以调试和理解。

这是完全反直觉的,查询的对象来修改对象的方法。没有人会希望调用who_am_i来修改对象。

在另一方面更换方法,比如,可以使单元测试类真的直线前进。

如果你想测试类不同年龄您可以在测试之前,注入这样的代码的行为。

相关问题