Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 将值赋给类的多个成员_Ruby_Arrays - Fatal编程技术网

Ruby 将值赋给类的多个成员

Ruby 将值赋给类的多个成员,ruby,arrays,Ruby,Arrays,现在我有了一个数组,比如 class A attr_accessor :dab .... end 现在我想为数组arr中存在的类a的所有实例设置一个值。在ruby/rails中有没有快捷方式可以做到这一点 此外,我还有一个继承自ActiveRecord::Base的 我的实际需要是: arr = [A.new, A.new, A.new] 因此,所有找到的对象都将dab设置为2 有快捷方式吗?要从数组中获取A类项目,可以使用“全选/全选” arr.select{el | el.cla

现在我有了一个数组,比如

class A
  attr_accessor :dab
  ....
end
现在我想为数组arr中存在的类a的所有实例设置一个值。在ruby/rails中有没有快捷方式可以做到这一点

此外,我还有一个继承自ActiveRecord::Base的

我的实际需要是:

arr = [A.new, A.new, A.new]
因此,所有找到的对象都将dab设置为2


有快捷方式吗?

要从数组中获取A类项目,可以使用“全选/全选”

arr.select{el | el.class==A}或arr.select{el | el | A==el}

虽然您希望为多个对象(而不是它们对应的类)指定一个值,但仍要实现实际结果。类A不定义实际对象,它只定义对象在创建时使用的蓝图。因此,找到一种方法来分配a的所有实例的值并不是你想要的,尽管我可能已经错过了你所要求的要点

要将值指定给对象数组,请执行以下操作:

A.find_all_by_some_condition.all.dabs = 2

也许你想在那之后保存它们,现在,arr.each&:save可能会派上用场。如果你还不知道的话,就去查号。非常有用。

要从数组中获取A类项目,可以使用select/find\u all

arr.select{el | el.class==A}或arr.select{el | el | A==el}

虽然您希望为多个对象(而不是它们对应的类)指定一个值,但仍要实现实际结果。类A不定义实际对象,它只定义对象在创建时使用的蓝图。因此,找到一种方法来分配a的所有实例的值并不是你想要的,尽管我可能已经错过了你所要求的要点

要将值指定给对象数组,请执行以下操作:

A.find_all_by_some_condition.all.dabs = 2

也许你想在那之后保存它们,现在,arr.each&:save可能会派上用场。如果你还不知道的话,就去查号。非常有用。

默认情况下,您不能直接这样做,但是您可以使用Ruby的方法构建类似的东西

两种解决方案:

解决方案1-使用包装器类

对于多赋值数组,我们将该类称为MArray

A.find_all_by_some_condition.each { |a| a.dab = 2 }
我们还需要添加对阵列中MArray的支持,以便进行包装。对于质量分配,我们将调用方法mas:

class MArray
  def initialize(inner_array)
    @inner = inner_array
  end

  def method_missing(meth, value)
    # Check if assignement, and if it is then run mass-assign
    if meth.to_s =~ /^\w+=$/
      @inner.each { |itm| itm.send(meth, value) }
    else
      raise ArgumentError, "MArray: not an assignment"
    end
  end
end
Blob = Struct.new(:dab)
arr = [Blob.new] * 3
arr.mas.dab = 123
arr
=> [#<struct Blob dab=123>, #<struct Blob dab=123>, #<struct Blob dab=123>]
用法很简单:

class Array
  def mas
    # Wrap MArray around self
    MArray.new(self)
  end
end
使用时间甚至比MArray更短:


默认情况下,您不能直接这样做,但是您可以使用Ruby的方法构建类似的东西

两种解决方案:

解决方案1-使用包装器类

对于多赋值数组,我们将该类称为MArray

A.find_all_by_some_condition.each { |a| a.dab = 2 }
我们还需要添加对阵列中MArray的支持,以便进行包装。对于质量分配,我们将调用方法mas:

class MArray
  def initialize(inner_array)
    @inner = inner_array
  end

  def method_missing(meth, value)
    # Check if assignement, and if it is then run mass-assign
    if meth.to_s =~ /^\w+=$/
      @inner.each { |itm| itm.send(meth, value) }
    else
      raise ArgumentError, "MArray: not an assignment"
    end
  end
end
Blob = Struct.new(:dab)
arr = [Blob.new] * 3
arr.mas.dab = 123
arr
=> [#<struct Blob dab=123>, #<struct Blob dab=123>, #<struct Blob dab=123>]
用法很简单:

class Array
  def mas
    # Wrap MArray around self
    MArray.new(self)
  end
end
使用时间甚至比MArray更短:


我的第一次尝试是向array类添加一个方法dab=value,并在最后将此代码添加到类的文件中。为了聪明/愚蠢,请检查dab=是否只处理类的实例:我的第一次尝试是向array类添加一个方法dab=值,并在最后将此代码添加到类的文件中。要聪明/愚蠢,请检查dab=是否只处理类的实例:您可以将每个实例与一个符号和/symbol/proc一起使用,就像使用map一样。Map实际上是用于转换数据结构,而不是用于迭代。您可以将每个数据结构与一个符号/symbol/proc一起使用,就像使用Map一样。Map实际上是用于转换数据结构,而不是用于迭代。