【问题标题】:Instance Eval Within Block块内实例评估
【发布时间】:2009-09-28 02:51:35
【问题描述】:

我有一个 Builder 类,可让您添加到其中一个实例变量:

class Builder
    def initialize
        @lines = []
    end

    def lines
        block_given? ? yield(self) : @lines
    end

    def add_line( text )
        @lines << text
    end
end

现在,我该如何改变这个

my_builder = Builder.new
my_builder.lines { |b|
    b.add_line "foo"
    b.add_line "bar"
}
p my_builder.lines # => ["foo", "bar"]

喜欢这个吗?

my_builder = Builder.new
my_builder.lines {
    add_line "foo"
    add_line "bar"
}
p my_builder.lines # => ["foo", "bar"]

【问题讨论】:

    标签: ruby


    【解决方案1】:
    class Builder
        def initialize
            @lines = []
        end
    
        def lines(&block)
            block_given? ? instance_eval(&block) : @lines
        end
    
        def add_line( text )
            @lines << text
        end
    end
    
    my_builder = Builder.new
    my_builder.lines {
        add_line "foo"
        add_line "bar"
    }
    p my_builder.lines # => ["foo", "bar"]
    

    【讨论】:

    • 再完美不过了。谢谢!
    【解决方案2】:

    您还可以使用 ruby​​ 最佳实践中使用的方法,使用带有 arity 的参数长度:

    类Foo

    attr_accessor :list
    
    def initialize
       @list=[]
    end
    
    def bar(&blk)
    
      blk.arity>0 ? blk.call(self) : instance_eval(&blk)
    
    end
    

    结束

    x=Foo.new

    x.bar 做 列表

    x.bar 做 |foo| foo.list

    放置 x.list.inspect

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-25
      • 2013-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-11
      • 2017-02-02
      • 1970-01-01
      相关资源
      最近更新 更多