ruby-on-rails - ruby:批量初始化实例变量

标签 ruby-on-rails ruby class object constructor

有没有简单的方法批量分配实例变量

  def initialize(title: nil, label_left: nil, label_right: nil, color_set: nil)
    @title = title
    @label_left = label_left
    @label_right = label_right
    @color_set = color_set
  end

我可以循环/迭代初始化参数并自动分配吗?

最佳答案

如果你想要特定的变量,那不是真的。在这里使用反射,即使它可用,也会很麻烦。

你在这里得到的是最微不足道的案例。通常您会看到看起来更像这样的代码:

def initialize(title: nil, label: nil, label_width: nil, color_set: nil)
  @title = title.to_s
  @label = label_left.to_s
  @label_width = label_width.to_i
  @color_set = MyRGBConverter.to_rgb(color_set)
end

初始化器是您可以进行任何必要的转换和验证的地方。如果其中一些参数需要为特定值,您将对其进行测试,引发 错误等异常。在最小情况下,您在此处拥有的重复代码通常会得到扩展和扩充,因此没有通用的解决方案。

这导致代码如下:

def initialize(title: nil, label: nil, label_width: nil, color_set: nil)
  @title = title.to_s
  unless (@title.match(/\S/))
    raise "Title not specified"
  end

  @label = label_left.to_s
  unless (@label.match(/\A\w+\z/))
    raise "Invalid label #{@label.inspect}"
  end

  @label_width = label_width.to_i
  if (@label_width <= 0)
    raise "Label width must be > 0, #{@label_width} specified."
  end

  @color_set = MyRGBConverter.to_rgb(color_set)
end

如果您真的不关心要接收哪些参数,那么您可以在 Ruby 2.3 中使用新的keyword-arguments 说明符 ** 执行此操作:

def initialize(**options)
  options.each do |key, value|
    instance_variable_set("@#{key}", value)
  end
end

请注意,如果这些值是用户提供的,则可能存在危险,因此您可能希望以某种方式将它们列入白名单:

VALID_OPTIONS = [ :title, :label_left, :label_right, :color_set ]

def initialize(**options)
  options.each do |key, value|
    raise "Unknown option #{key.inspect}" unless (VALID_OPTIONS.include?(key))

    instance_variable_set("@#{key}", value)
  end
end

当您看到大量此类参数被定期传入时,您可能想要评估创建某种类似结构的对象并传递它是否是一个更好的计划。这取决于您的代码的工作方式。

关于ruby-on-rails - ruby:批量初始化实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40730172/

相关文章:

ruby-on-rails - 我如何获得 Ruby 类的名称?

ruby - Rails 之外的 Webrat Mechanize

c++ - 将基类的指针转换为继承类

ruby-on-rails - Rails中ActiveRecord中的多个sum()

ruby-on-rails - Rails 3. 如何从查询结果中删除重复的关联记录?

javascript - 如何在 ReactJS 组件中使用 Ruby 方法?

java - 如何创建带有内置变量的 Java 类

javascript - Rails JavaScript View 在生产环境中不起作用

ruby - Ruby 哈希的括号语法

c++ - CUDA 流破坏和 CudaDeviceReset