2015-02-24 182 views
1

我有下面的类实例化实例变量为块

class Increasable 

    def initializer(start, &increaser) 
    @value = start 
    @increaser = increaser 
    end 

    def increase() 
    value = increaser.call(value) 
    end 
end 

如何用块初始化?这样做

inc = Increasable.new(1, { |val| 2 + val}) 

irb我得到

(irb):20: syntax error, unexpected '}', expecting end-of-input 
inc = Increasable.new(1, { |val| 2 + val}) 

回答

2

您的方法调用语法不正确。

class Increasable 
    attr_reader :value, :increaser 

    def initialize(start, &increaser) 
    @value = start 
    @increaser = increaser 
    end 

    def increase 
    @value = increaser.call(value) 
    end 
end 

Increasable.new(1) { |val| 2 + val }.increase # => 3 

Best explanation of Ruby blocks?知道块在Ruby中是如何工作的。

1

我看到你的代码不同的错误。纠正后,您可以申请lambda

inc = Increasable.new(1, ->(val){ 2 + val}) # => 3 

一些链接,可以帮助理解发生了什么:

class Increasable 
    def initialize(start, increaser) 
    @value = start 
    @increaser = increaser 
    end 

    def increase() 
    @value = @increaser.call(@value) 
    end 
end 

并通过调用它

  1. Lambdas
  2. Classes
  3. Lambdas 2