首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有一种干净的方法来删除常见的ruby对象初始化代码?

有没有一种干净的方法来删除常见的ruby对象初始化代码?
EN

Stack Overflow用户
提问于 2021-07-11 08:48:01
回答 1查看 70关注 0票数 0

有没有一种简单的方法来遍历attr_reader属性并设置它们?

代码语言:javascript
运行
复制
class Foo
  attr_reader :bar, :baz, ...

  def initialize attrs
    @bar = attrs[:bar]
    @baz = attrs[:baz]
    .
    .
    .
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-11 18:22:09

如果希望散列键与属性名匹配,一种可能是继承结构:

代码语言:javascript
运行
复制
class Foo < Struct.new(:bar, :baz, keyword_init: true) # Note the "keyword_init" parameter
end

puts Foo.new(bar: 42, baz: :foo).bar
# => 42

结构还将创建公共编写器,因此如果希望它们不是公共编写器,则必须将它们设置为私有

代码语言:javascript
运行
复制
FOO_ATTRS = [:bar, :baz]
class Foo < Struct.new(*FOO_ATTRS, keyword_init: true) # Note the "keyword_init" parameter
  # Make method 'my_attribute=' private if needed
  private *FOO_ATTRS.map { |attr| "#{attr}=" }
end

puts Foo.new(bar: 42, baz: :foo).bar

如果要重命名不同属性名称的散列键:

代码语言:javascript
运行
复制
class Foo
  INITIAL_ATTRS = {
   foo: :@bar,
   bar: :@baz
  }

  attr_reader *(INITIAL_ATTRS.values.map { |k| k.to_s.delete('@').to_sym })

  def initialize attrs
    attrs.slice(*INITIAL_ATTRS.keys).each do |var, value|
      instance_variable_set(INITIAL_ATTRS[var], value)
    end
  end
end

编辑

另一种可能是使用私有attr_writer,这样你就不必处理@ tricks了

代码语言:javascript
运行
复制
class Foo
  INITIAL_ATTRS = {
   foo: :bar,
   bar: :baz
  }

  attr_reader *(INITIAL_ATTRS.values)

  def initialize attrs
    attrs.slice(*INITIAL_ATTRS.keys).each do |var, value|
      send("#{INITIAL_ATTRS[var]}=", value)
    end
  end

  private

   attr_writer *(INITIAL_ATTRS.values)
end

请注意,如果您不想将foo转换为bar,则可以使用数组而不是INITIAL_ATTRS的散列。这将通过删除.values.keys来简化代码

代码语言:javascript
运行
复制
class Foo
  INITIAL_ATTRS = [:foo, :bar]

  attr_reader *INITIAL_ATTRS

  def initialize attrs
    attrs.slice(*INITIAL_ATTRS).each do |var, value|
      send("#{var}=", value)
    end
  end

  private

   attr_writer *INITIAL_ATTRS
end
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68332510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档