2013-12-20 123 views
0

我有了要完成类似的东西一门功课:如何在没有课程的情况下调用类方法?

module Foo 
    def self.bar 
    yield 
    end 

    def helper (number) 
    p number 
    end 
end 

Foo.bar do 
    helper 5 
end 

这当然给了一个错误,因为“帮手”是不是在对象定义。但是,在任务,它说简单是富,必须使用这种方式:

Foo.bar do 
    helper 5 
end 

这并不是说其中“帮手”的定义,虽然。我如何能够像这样调用这个方法?

回答

3

写如下代码:

module Foo 
    def self.bar 
    yield 
    end 
end 

def helper (number) 
    p number 
end 

Foo.bar do 
    helper 5 
end 

把方法helper在顶层。然后helper将成为类Object的私有实例方法。您将电话Foo.bar传递给一个区块,并将其封锁,从而进入其周围环境。所以helper 5main隐式调用,顶级Object类实例。现在代码将起作用。

另一种方法是在顶层使用Module#include方法将Foo模块包含到类Object中。

module Foo 
    def self.bar 
    yield 
    end 

    def helper (number) 
    p number 
    end 
end 

# this will make available `helper` method as an instance method to the Object class. 
include Foo 

Foo.bar do 
    helper 5 
end 
+1

@ГошУ是..我已经更新.. –

3

您可以使用instance_eval来评估对象上下文中的块。事情是这样的:

class Foo 
    def bar(&block) 
    instance_eval(&block) 
    end 

    def helper(number) 
    p number 
    end 
end 

Foo.new.bar do 
    helper 5 
end 

你也可以将bar一个类的方法,并呼吁:

class Foo 
    def self.bar(&block) 
    new.instance_eval(&block) 
    end 
    # ... 
end 

Foo.bar { helper 5 } 

或返回实例:

class Foo 
    def self.bar(&block) 
    new.tap { |foo| foo.instance_eval(&block) } 
    end 
    # ... 
end 

foo = Foo.bar { helper 5 } 
相关问题