通过调用函数生成块

时间:2014-07-18 21:48:50

标签: ruby

class SomeClass    

def initialize
    yield
end

def test
    puts 'test'
end 
end

当我初始化一些SomeClass时,我想在块内执行测试函数。     SomeClass.new {test()} 这给了我

NoMethodError: undefined method `test' for main:Object

4 个答案:

答案 0 :(得分:3)

您正在寻找instance_eval

class SomeClass    

  def initialize(&block)
    instance_eval(&block) if block_given?
  end

  def test
    puts 'test'
  end 
end

SomeClass.new { test() }    #=> test

答案 1 :(得分:3)

这很简单,只需通过self

class SomeClass    
  def initialize
    yield self if block_given?
  end

  def test
    puts 'test'
  end 
end

SomeClass.new { |ob| ob.test }
# >> test

你的那个没有用,因为块是关闭的,并且self在你的例子中的块内设置为mainmainObject的一个实例。您没有违反#test内的Object,因此main会尝试拨打#test,但您收到了真正的错误。

答案 2 :(得分:2)

或者您可以使用呼叫,如下所示:

class SomeClass    

  def initialize(&block)
    block.call(self) if block_given?
  end

  def test
    puts 'test'
  end 
end

SomeClass.new {|s| s.test }

答案 3 :(得分:0)

两种解决方案:

1

  class SomeClass    

    def initialize(&block)
      instance_eval(&block)
    end

    def test
      puts 'test'
    end 
  end

  SomeClass.new { test() }    #=> test

2

  class SomeClass    

    def initialize
      yield self
    end

    def test
      puts 'test'
    end 
  end

  SomeClass.new {|o| o.test() }    #=> test

有些参考资料希望对您有所帮助:

1.instance_eval不再在ruby 1.9中产生自我:https://www.ruby-forum.com/topic/189422

2.如何使用yield和instance_eval构建DSL?:http://rubylearning.com/blog/2010/11/30/how-do-i-build-dsls-with-yield-and-instance_eval/