2010-06-23 38 views
0

我想消除“=”符号的特定原因。它可能看起来像这样:替代“=”的红宝石方法

cat_that_has_name("Kelly").as(:kelly) 
kelly.do_something 

这里的“as”方法用于生成引用我的猫的方法“kelly”。任何人都可以帮助我吗?

任何建议,将不胜感激。

更新:

约尔格是正确的,我已经添加了一个简单的测试来证明我的意图:

require "test/unit" 

class AsTest < Test::Unit::TestCase 
    def setup 
    @cats = ["Kelly", "Tommy"] 
    end 

    def teardown 
    end 

    def test_as 
    kelly1 = get_cat("Kelly") 
    get_cat("Kelly").as(:kelly2) 
    assert_equal(kelly1.object_id, kelly2.object_id) 
    end 

    private 
    def get_cat(name) 
    @cats.each do |cat| 
     if cat.to_s==name 
     return cat 
     end 
    end 
    return nil 
    end 
end 
+0

你想消除哪个特定'=',在你的例子中看不到一个? – 2010-06-23 17:54:45

+0

如果你的代码是“之后”,那么“之前”会是“kelly = cat_that_has_name(”Kelly“); kelly.do_something'? – 2010-06-23 23:22:03

+0

@安德鲁,你是对的。 – eric2323223 2010-06-24 02:03:49

回答

3

这是一种很难找出你真正想要的东西。如果你想得到一些明智的答案,你将不得不提供你想要达到的完整代码示例(例如,你发布的代码缺少cat_that_has_nameso_something方法的定义)。您还需要发布一个完整的规范,说明您期望使用哪种方法,以及使用示例,最好还使用测试套件。毕竟,如果您没有定义“正确”的含义,我们如何知道我们的答案是否正确?

我可以从你的神秘问题破译最好是这样的:

class Object 
    def as(name) 
    s = self 
    Object.send(:define_method, name) { s } 
    Object.send(:private, name) 
    end 
end 

但是没有办法知道这是否有效的方式,因为如果我尝试运行您的代码示例中,我得到一个NoMethodError对于cat_that_has_name和另一个NoMethodError对于so_something

还请注意,你的问题是自我矛盾:在你的主题行你问的方法来代替=(即创建变量),但在你的问题你谈到创建方法,这将意味着你正在寻找代替def而不是=。如果有测试套件,再次正确回答会容易得多。

+0

你是对的,测试是一种更好的解释方式。 – eric2323223 2010-06-24 02:39:09

+0

@ eric2323223:嗨,我的代码实际上通过了测试。我没有想到。 – 2010-06-24 03:17:03