我有一个带有构造函数的类,它接受两个参数并将字段设置为这些值。我还希望能够通过在传递给构造函数的 block 内显式设置字段来初始化此类中的对象。
构造函数:
class Grammar
attr_reader :rules, :start, ...
def initialize(rules, start)
@rules = rules
@start = start
...
end
end
传递给构造函数的参数涉及创建几个对象,这些对象仅用作参数 rules
和 start
的中间构建 block ,限制存在是有意义的这些对象的 block 传递给构造函数。在这个 block 中,我希望首先构建中间对象,然后直接设置新对象的字段。
我希望能够像这样实例化 Grammar
:
grammar = Grammar.new { |g|
...
# build rules and start
...
g.start = start
g.rules = rules
}
我应该如何修改构造函数以允许两种初始化方法?
最佳答案
如果它们已经有了 attr_writer
和/或 attr_accessor
,那么将这个功能添加到大多数类中实际上非常容易:
class Grammar
attr_accessor :rules, :start, ...
def initialize(rules, start)
@rules = rules
@start = start
...
yield self if block_given?
end
end
现在您可以完全按照自己的意愿行事。 yield self
部分将向 block 提供正在初始化的对象,并且 block_given?
只有在您向新
调用。您需要在设置所有默认值后运行它。
关于ruby - 使用 block 而不是构造函数参数初始化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55977543/