加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 分配分支条件太高

发布时间:2020-12-16 23:07:33 所属栏目:百科 来源:网络整理
导读:我有一个简单的类,在初始化时,需要一到八个参数.它将访问器设置为稍后使用. Rubocop正试图逮捕我,因为ABC太高了,但我不确定我所做的事情是否真的有问题.这是我刚刚在初始化时禁用检查的情况吗? class Foo attr_accessor :one,:two,:three,:four attr_access
我有一个简单的类,在初始化时,需要一到八个参数.它将访问器设置为稍后使用. Rubocop正试图逮捕我,因为ABC太高了,但我不确定我所做的事情是否真的有问题.这是我刚刚在初始化时禁用检查的情况吗?
class Foo
  attr_accessor :one,:two,:three,:four
  attr_accessor :five,:six,:seven,:eight

  def initialize(p={})
    @one = p[:one] if p[:one].present?
    # ...
    @eight = p[:eight] if p[:eight].present?
  end
end

我对减小大小的唯一想法是做一些事情,比如在初始化时迭代我的所有attr_accessors,看看是否在has中传递了相应的符号,如果是这样的话.

class Foo
  attr_accessor :one,:eight

  def initialize(p={})
    instance_variables.each do |variable|
      send("@#{variable}") = p["#{send(variable)}".to_sym] if p["#{send(variable)}".to_sym].present?
    end
  end
end

但这似乎有点弱.

解决方法

以下是实现您要做的事情的方法之一:
class Foo
  %i(one two three four five six seven eight).each { |attribute| attr_accessor attribute }

  def initialize(p = {})
    p.keys.each { |k| instance_variable_set("@#{k}",p.fetch(k,nil)) }
  end
end

查看Hash#fetch方法.

您还可以使用它来访问p变量的键值对,如果您不是8个变量决定使用一个变量(@p)

编辑

只是出于好奇而写了这个版本(使用了一些元编程) – 它将为添加的实例变量动态添加attr_accessor:

class Foo
  def initialize(p = {})
    p.keys.each do |k|
      instance_variable_set("@#{k}",nil))
      self.class.__send__(:attr_accessor,k)
    end
  end
end

发生了什么,我们提供初始化方法参数(散列p),获取其键并从中创建实例变量,为每个变量分配与键对应的值.然后我们为每个键定义attr_accessor.

a = Foo.new(a: 2,b: 3)
#=> #<Foo:0x00000002d63ad8 @a=2,@b=3>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读