1

我试图动态地要求然后在初​​始化方法中包含模块。

# file: object.rb

class Object

  attr_accessor :array

  def initialize array
    @array = array
    @array.each do |f|
      require_relative "#{f}"
      include f.capitalize # the method name is the same as the filename
      puts @variable # property from included method
    end
  end
end

object = Object.new ['a','b','c']

使用这些模块文件

# file: a.rb

module A
  @variable = 'string A'
end

等等 b 和 c

我不断收到错误消息:

`block in initialize': undefined method `include'

我在这里做错了什么,有没有更好的方法来实现我想要做的事情?

4

2 回答 2

2

您不能这样调用的原因includeinitialize,这include是一个仅在类和模块上定义的方法,但在像initialize隐式接收器这样的实例方法内部是类的对象,而不是类本身。

由于您只需要在新创建的对象上可用的方法,您可以只使用extend而不是include. extend就像每个对象的版本一样include,它将给定模块的方法作为单例方法添加到对象中,而不是将它们作为实例方法添加到模块或类中。

于 2013-09-04T17:24:54.303 回答
2
require_relative "#{f}"

注意引号。'#{f}'没有插值。

于 2013-09-04T17:35:02.047 回答