Ruby 如果没有类,如何调用类方法?

Ruby 如果没有类,如何调用类方法?,ruby,Ruby,我有一个家庭作业必须完成类似的任务: module Foo def self.bar yield end def helper (number) p number end end Foo.bar do helper 5 end 这当然会给出一个错误,因为对象中没有定义“helper”。但在任务中,它直截了当地指出,必须以这种方式使用Foo: Foo.bar do helper 5 end 但它并没有说明“helper”是在哪里定义的。如何像上面

我有一个家庭作业必须完成类似的任务:

module Foo
  def self.bar
    yield
  end

  def helper (number)
    p number
  end
end

Foo.bar do 
  helper 5
end
这当然会给出一个错误,因为对象中没有定义“helper”。但在任务中,它直截了当地指出,必须以这种方式使用Foo:

Foo.bar do 
  helper 5
end
但它并没有说明“helper”是在哪里定义的。如何像上面这样调用此方法?

编写如下代码:

module Foo
  def self.bar
    yield
  end
end

def helper (number)
  p number
end

Foo.bar do 
  helper 5
end
将方法
helper
置于顶层。然后
helper
将成为类
对象的私有实例方法。您正在将一个块传递给调用
Foo.bar
,并且该块作为闭包,可以访问其周围环境。因此,
helper 5
将被
main
顶级
Object
类实例隐式调用。现在代码可以工作了

另一种方法是使用顶层的方法将
Foo
模块包含到类
对象中

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
编写如下代码:

module Foo
  def self.bar
    yield
  end
end

def helper (number)
  p number
end

Foo.bar do 
  helper 5
end
将方法
helper
置于顶层。然后
helper
将成为类
对象的私有实例方法。您正在将一个块传递给调用
Foo.bar
,并且该块作为闭包,可以访问其周围环境。因此,
helper 5
将被
main
顶级
Object
类实例隐式调用。现在代码可以工作了

另一种方法是使用顶层的方法将
Foo
模块包含到类
对象中

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
可以使用在对象的上下文中计算块。大概是这样的:

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 }
可以使用在对象的上下文中计算块。大概是这样的:

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 }