ruby - 使用 block 而不是构造函数参数初始化对象

标签 ruby object

我有一个带有构造函数的类,它接受两个参数并将字段设置为这些值。我还希望能够通过在传递给构造函数的 block 内显式设置字段来初始化此类中的对象。

构造函数:

class Grammar
    attr_reader :rules, :start, ...
    def initialize(rules, start)
        @rules = rules
        @start = start
        ...
    end
end

传递给构造函数的参数涉及创建几个对象,这些对象仅用作参数 rulesstart 的中间构建 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/

相关文章:

ruby db结果集到散列中的数组

ruby-on-rails - Rails Figaro gem - 不知道如何构建任务 'figaro:heroku' (Rails 4/figaro gem/heroku))

从参数给定引用的对象的 Java 生命周期

javascript - 从数组中的另一个对象更新数组中的对象

删除对象数组时出现 C++ 堆异常

ruby-on-rails - Ruby 错误代码 : -90 中的 MailChimp API 问题

ruby-on-rails - Nginx + Phusion 乘客 try_files

ruby - 复合 bool 表达式 : Void Value Expression

c++ - 在 C++ 方法中返回对象的方法

javascript for循环更改原始列表变量