2014-03-05 38 views
1

我走过了Ruby Koans和我有about_proxy_object_project.rb
麻烦这是我的解决方案红宝石Koans代理项目

class Proxy 
    attr_reader :messages 

    def initialize(target_object) 
    @object = target_object 
    # ADD MORE CODE HERE 
    @messages = [] 
    end 

    def number_of_times_called(method_name) 
    @messages.count method_name 
    end 

    def called?(method_name) 
    @messages.include? method_name 
    end 

    def method_missing(method_name, *args, &block) 
    if @object.respond_to? method_name 
     @object.send(method_name, *args) 
     @messages << method_name 
    else 
     super method_name, *args, &block 
    end 
    end 
end 

,但是当我输入rake我得到这个

The answers you seek... 
    Expected 10 to equal [:channel=, :power, :channel] 

Please meditate on the following code: 
    /home/Shanicky/koans/about_proxy_object_project.rb:61:in `test_tv_methods_still_perform_their_function' 

并在我的about_proxy_object_project.rb

def test_tv_methods_still_perform_their_function 
    tv = Proxy.new(Television.new) 

    tv.channel = 10 
    tv.power 

    assert_equal 10, tv.channel # this is the 61st line 
    assert tv.on? 
end 

我很困惑
我哪里做错了?
感谢所有

,这是我Television

class Television 
    attr_accessor :channel 

    def power 
    if @power == :on 
     @power = :off 
    else 
     @power = :on 
    end 
    end 

    def on? 
    @power == :on 
    end 
end 
+0

没之前修改电视类中的任何方法,所以我认为信道的方法应该返回10,但它似乎返回类似的阵列[:通道=,:电源,:信道],所以我很困惑 –

+0

你可以发布'Television'类的定义吗? – Agis

+0

@Agis谢谢你,我修改了问题并发布了定义 –

回答

2

在这种if子句:

if @object.respond_to? method_name 
    @object.send(method_name, *args) 
    @messages << method_name # <-- this is the return value you get 
else 
    super method_name, *args, &block 
end 

支票@object.respond_to? method_name始终计算为true因为Television类定义所有这些方法你”已经呼吁其对象(channel=power,channel)。因此,if的第一个分支运行,并且此代码实质上将添加到@messages实例变量(这是一个Array)您调用的方法名称。

因此,当您拨打tv.channel时,该方法的返回值是上述代码中的注释语句,当然这不等于10。你基本上得到@messages << method_name的返回值,它是新的@messages数组,它实际上包含了你在此之前调用的所有未定义的方法:[:channel=, :power, :channel]

+0

我得到了很多谢谢 –

+0

不客气:)不妨接受答案,如果它对你有帮助。祝你好运! – Agis

0

您可以直接使用'发送'而无需检查。没有使用'else'的目的,因为它总是返回一些异常。

def method_missing(method_name, *args, &block) 
    @messages << method_name 
    @object.send(method_name, *args, &block) 
end