一种替换“=”的ruby方法

时间:2010-06-23 10:10:40

标签: ruby metaprogramming

我想因特殊原因消除“=”符号。它可能看起来像这样:

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

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

任何建议都将受到赞赏。

更新

Jorg是对的,我添加了一个简单的测试来证明我的意图:

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

1 个答案:

答案 0 :(得分:3)

很难弄清楚你真正想要的是什么。如果您需要一些合理的答案,则必须提供您想要实现的完整代码示例(例如,您发布的代码缺少cat_that_has_nameso_something方法的定义。您还需要发布一个完整的规范,说明您希望as方法做什么,使用示例,最好还有测试套件。毕竟,如果你没有定义“正确”的含义,我们怎么知道我们的答案是否正确?

我能从你神秘的问题中解读的最好的东西是这样的:

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

但是无法知道这是否有效,因为如果我尝试运行您的代码示例,我会NoMethodError获得cat_that_has_nameNoMethodError获得so_something }。

另请注意,您的问题是自我不一致的:在您的主题行中,您询问有关替换=的方法(即创建变量),但在您的问题中,您谈到了创建方法 ,这意味着您正在寻找def而不是=的替代品。同样,如果有一个测试套件,那么更容易正确回答。