Ruby:检查数组中所有对象的属性是不是相等
Posted
技术标签:
【中文标题】Ruby:检查数组中所有对象的属性是不是相等【英文标题】:Ruby: Check if all objects' attribute within array are equalRuby:检查数组中所有对象的属性是否相等 【发布时间】:2015-10-04 17:58:56 【问题描述】:我有一个包含对象的数组。我想检查数组中的所有元素(对象)是否具有相似的属性值。
所以,如果我们有以下数组
array = [clone1, clone2, clone3]
clone1、clone2 和 clone3 是类 clone 的对象。它们包含一个名为“源”的属性。我想检查 clone1、clone2 和 clone3 是否具有相同的“源”值。
这是一个克隆对象的例子
#<CloneTool:0x007ff968a2f7b0 @nline=["10"], @sim=["100"], @ds=[".."], @dstart=[".."], @dend=[".."], @hs=[".."], @hstart=[".."], @hend=[".."]>
所以我想检查 @ds 的数组是否具有相同的值。
有什么想法吗?
【问题讨论】:
ary.all? |elem| elem.source == ary.first.source
ary.any? |elem| elem.source != ary.first.source # find one that NOT equal
@gaussblurinc:通常情况下,您希望明确说明您的意图。看来,他打算检查所有元素是否具有相同的值。检查是否有任何元素具有不同的值在某种程度上掩盖了意图。
@SergioTulentsev 就短路而言,它没有区别。 all?
在块计算为 false
时短路,any?
在块计算为 true
时短路。并且由于后者的块是前者的否定,因此它们将在完全相同的示例上短路。
@gaussblurinc:sawa 提醒我们 all?
也会短路 :)
【参考方案1】:
array.map(&:source).uniq.length == 1
或
array.group_by(&:source).length == 1
【讨论】:
它给出了“错误的参数类型 String (expected Proc) (TypeError)” @arwa:你一定是搞砸了复制这条线。如果你的元素有方法source
,它应该可以工作
这对我有用,我猜他的克隆对象与我们想象的不同,这导致了他的失败。而不是 map(&:source) 它可能需要是 map|x| x[:source] 或类似的东西。【参考方案2】:
arr.uniq(&:source).size == 1
如果@source
没有访问器:
arr.uniq |e| e.instance_variable_get(:@source) .size == 1
【讨论】:
【参考方案3】:array.map|x| x.source == array[0].source.all?
【讨论】:
它不适用于特殊数组。例如,一个元素的数组 @gaussblurinc 它确实有效。在这种情况下,结果将是微不足道的true
。注意[].all? # => true
.
all?
的用法很奇怪。 “全部”是什么?
@sawa: 但map
负责在这里为all?
准备数据。以上是关于Ruby:检查数组中所有对象的属性是不是相等的主要内容,如果未能解决你的问题,请参考以下文章