如何在Ruby中分解超类对象中的数组并将数组元素放入两个子类对象中

如何在Ruby中分解超类对象中的数组并将数组元素放入两个子类对象中,ruby,arrays,class,Ruby,Arrays,Class,假设我有两门课: class One attr_reader :array def initialize(array) @array = array end end class Two < One attr_reader :array def initialize @array = [] end end 是否可以拆分存储在“a”中的@array数组,并将这两个元素放置在“b”和“c”中,以便: if element is odd, place i

假设我有两门课:

class One
  attr_reader :array
  def initialize(array)
    @array = array
  end
end

class Two < One
  attr_reader :array
  def initialize
    @array = []
  end
end
是否可以拆分存储在“a”中的@array数组,并将这两个元素放置在“b”和“c”中,以便:

if element is odd, place it in b.array.
if element is even, place it in c.array.

Output:
  b.array = [1]
  c.array = [2]
我知道这可能是合法的Ruby,因为我正在学习继承是如何工作的…

您可以使用:


第一类
属性读取器:数组
def初始化(阵列)
@数组=数组
结束
结束
二班<一班
属性读取器:数组
def初始化
@数组=[]
结束
结束
数组=[1,2]
a=一个。新(数组)
b=2.5新
c=2.5新
奇数,偶数=array.partition{| x | x%2==1}
b、 数组.concat奇数
c、 array.concat偶数
b、 排列
# => [1]
c、 排列
# => [2]
注意:正如meagar所评论的,这个问题与继承无关。您根本不需要在这里使用类。

TL;博士 这里实际上不需要多个对象。事实上,您甚至不需要定制类。如果您确实使用了一个类,这个用例的一个典型Ruby习惯用法是将一个块传递给getter方法。或者,您可以定义自己的自定义getter来接受参数

所有方法都需要一个块 在Ruby中,所有方法都隐式地将块作为最后一个参数。考虑下面的例子:

class One
  attr_reader :array
  def initialize array
    @array = array
  end
end

a = One.new [*1..5]

a.array
#=> [1, 2, 3, 4, 5]

a.array.select { |e| e.odd?  }
#=> [1, 3, 5]

a.array.select { |e| e.even? }
#=> [2, 4]
您可以仅使用单个类获得所需的行为(例如,数组数据的不同视图),但如果需要,仍然可以访问@array中存储的整个数据集

getter的参数 如果您想在类中存储行为并提供接口,一种方法是自己提供一个显式getter方法,而不是让Ruby使用#attr_reader为您创建一个。例如,通过为一个#数组提供可选参数,可以控制是获取整个数组还是子集。考虑以下事项:

class One
  def initialize array
    @array = array
  end

  def array mod=nil
    mod ? @array.select { |e| e.modulo(mod).zero? } : @array
  end
end

a = One.new [*1..10]

a.array
#=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

a.array 2
#=> [2, 4, 6, 8, 10]

a.array 5
#=> [5, 10]

只要对象具有定义良好的接口,两个选项(以及其他选项)都同样有效。这实际上只取决于您试图用代码表达什么,以及您的代码需要多大的灵活性。

这可能是可能的,但这实际上与继承无关。继承并不是为了适应这类问题而设计的,继承对解决这类问题来说,与其说是一种好处,不如说是一种阻碍。你所说的这种使用是对继承的滥用。您也没有给我们提供足够的信息来提出适当的解决方案。如果我做了
d=Two.new
?第三个元素会被放置在
d
中吗?什么是
1.初始化
2.初始化
(或
类#初始化
)?很好,ft.我的第一反应是,“concat
如何与读访问器一起工作?”?当然可以。@falsetru我该如何在一个类中把它变成一个方法呢?或者把它变成另一个类中的方法?@Lasonic,你想要这样的东西吗@falsetru谢谢你,你能帮我一下吗
class One
  attr_reader :array
  def initialize(array)
    @array = array
  end
end

class Two < One
  attr_reader :array
  def initialize
    @array = []
  end
end

array = [1,2] 
a = One.new(array)
b = Two.new
c = Two.new

odd, even = array.partition {|x| x % 2 == 1}
b.array.concat odd
c.array.concat even
b.array
# => [1]
c.array
# => [2]
class One
  attr_reader :array
  def initialize array
    @array = array
  end
end

a = One.new [*1..5]

a.array
#=> [1, 2, 3, 4, 5]

a.array.select { |e| e.odd?  }
#=> [1, 3, 5]

a.array.select { |e| e.even? }
#=> [2, 4]
class One
  def initialize array
    @array = array
  end

  def array mod=nil
    mod ? @array.select { |e| e.modulo(mod).zero? } : @array
  end
end

a = One.new [*1..10]

a.array
#=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

a.array 2
#=> [2, 4, 6, 8, 10]

a.array 5
#=> [5, 10]