小编kev*_*kev的帖子

动态替换Ruby中对象的方法实现

我想用一个用户指定的块替换对象的方法的实现.在JavaScript中,这很容易实现:

function Foo() {
    this.bar = function(x) { console.log(x) }
}
foo = new Foo()
foo.bar("baz")
foo.bar = function(x) { console.error(x) }
foo.bar("baz")
Run Code Online (Sandbox Code Playgroud)

在C#中它也很容易

class Foo
{
    public Action<string> Bar { get; set; }
    public Foo()
    {
        Bar = x => Console.WriteLine(x);
    }
}

var foo = Foo.new();
foo.Bar("baz");
foo.Bar = x => Console.Error.WriteLine(x);
foo.Bar("baz");
Run Code Online (Sandbox Code Playgroud)

但是我怎么能在Ruby中做同样的事情呢?我有一个解决方案,将lambda存储在一个实例变量中,该方法调用lambda,但我真的不喜欢开销和语法

class Foo
  def initialize
    @bar = lambda {|x| puts x}
  end

  def bar x
    @bar.call x
  end

  def bar= blk
    @bar = blk
  end …
Run Code Online (Sandbox Code Playgroud)

ruby metaprogramming

8
推荐指数
1
解决办法
9019
查看次数

标签 统计

metaprogramming ×1

ruby ×1