如何从数组中删除某些元素并选择它们?
例如:
class Foo
def initialize
@a = [1,2,3,4,5,6,7,8,9]
end
def get_a
return @a
end
end
foo = Foo.new
b = foo.get_a.sth{ |e| e < 4 }
p b # => [1,2,3]
p foo.get_a # => [4,5,6,7,8,9,10]
我可以使用什么替代 foo.get_a.sth
?
如果您不需要保留a
的对象ID:
a = [1,2,3,4,5,6,7,8,9,10]
b, a = a.partition{|e| e < 4}
b # => [1, 2, 3]
a # => [4, 5, 6, 7, 8, 9, 10]
如果您需要保留a
的对象标识符,则使用临时数组c
:
如果您需要保留a
的对象标识符,则使用临时数组c
:
a = [1,2,3,4,5,6,7,8,9,10]
b, c = a.partition{|e| e < 4}
a.replace(c)
a
。a
是 some_object.get_some_array
函数的结果。 - NewMrda.select { |e| e < 4 }
,它会返回通过测试的元素。 - Aaron Croninsome_object.set_some_array c
而不是a.replace c
。 - NewMrda = [1, 2, 3]
#=> [1, 2, 3]
a.extract! { |n| n.even? }
#=> [2]
a
#=> [1, 3]
如果您只删除一个项目,则不需要复制数组等操作:
array = [{ id: 1 }, { id: 2 }, {id: 3 }]
array.delete_at(array.find_index { |element| element[:id] == 1 })
#=> {:id=>1}
a = [1, 2, 3, 4]
a.dup - (a.delete_if(&:even?))
#=> [2, 4]
a
#=> [1, 3]
a = [1, 2, 3, 4]
b = a.dup - (a.delete_if { |e| e < 4 })
a
#=> [4]
b
#=> [1, 2, 3]
编辑:听起来你只是想要#select
...
a = [1, 2, 3, 4]
a.select { |e| e < 3 }
#=> [1, 2]
我还是不相信 Ruby 的默认库中没有类似的方法。应该有一个与 #drop 方法等效的方法。肯定有一个可用的 gem 可以为数组类添加这个功能。但是当你可以编写自己的脚本时,谁还需要 gem 呢:
#in initializer somewhere
class Array
def exclude(obj)
x = self
x.delete(obj)
x
end
end
我可能会向Ruby GitHub项目提交一个pull request,以便使用这个方法。这个超人补丁目前运行得非常好。
Foo
类中的实例变量@a
没有任何作用,应该将其删除。 - sawa@a = [1,2,3,4,5,6,7,8,9]
是某个过程的结果。 - NewMrd