【问题标题】:Delete from Array and return deleted elements in Ruby从 Array 中删除并返回 Ruby 中已删除的元素
【发布时间】:2013-07-31 14:32:29
【问题描述】:

如何从数组中删除一些元素并选择它们?

例如:

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 上的实例变量 Foo 没有做任何事情。你应该删除它。
  • 问题被抽象化,细节被移除。您可以假设@a = [1,2,3,4,5,6,7,8,9] 行是某个过程的结果。
  • 对不起!!我习惯了java形式!!! :p
  • abstractFactoryFactory 在哪里? jk,但是说真的,ruby 是一种与 java 不同的文化,请使用更清晰的示例,也许还可以参考真实世界的对象等等。很难读懂。

标签: arrays ruby select


【解决方案1】:

如果不需要保留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 的对象id,则使用时间数组c

a = [1,2,3,4,5,6,7,8,9,10]
b, c = a.partition{|e| e < 4}
a.replace(c)

【讨论】:

  • 不错的答案,但我无法更改aasome_object.get_some_array 函数的结果
  • @NewMrd 为什么你不能改变它?一个变量就是一个变量,所以你总是可以分配一个作为调用的结果,那么这个模式就可以正常工作了。
  • 在这种情况下你不能只使用a.select { |e| e &lt; 4 }吗?这将返回通过测试的元素。
  • 坦克@sawa。我使用some_object.set_some_array c 而不是a.replace c
【解决方案2】:

Rails 6 现在有这个:

a = [1, 2, 3]
#=> [1, 2, 3]
a.extract! { |n| n.even? }
#=> [2]
a
#=> [1, 3] 

【讨论】:

    【解决方案3】:

    如果您只删除一项,则不需要复制数组等:

    array = [{ id: 1 }, { id: 2 }, {id: 3 }]
    array.delete_at(array.find_index { |element| element[:id] == 1 })
    #=> {:id=>1} 
    

    【讨论】:

    • 这是满足我类似需求的应用的完美解决方案。
    • 如果 find_index 返回 nil 将失败
    【解决方案4】:
    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]
    

    【讨论】:

    • 如果有重复的元素,那么块会为它们返回相同的值,所以这不是问题!
    • 你能举个例子吗?
    【解决方案5】:

    我仍然不相信 ruby​​ 在其默认库中没有此功能。应该有与此等效的#drop 方法。当然,有一个可用的 gem 可以将功能添加到数组类中。但是,当您可以分解自己的脚本时,谁还需要宝石:

    #in initializer somewhere
    class Array
      def exclude(obj)
        x = self
        x.delete(obj)
        x
      end
    end
    

    我可能会为此方法向 ruby​​ github 项目提交拉取请求。到目前为止,这个超人补丁运行良好。

    【讨论】:

      猜你喜欢
      • 2021-12-13
      • 1970-01-01
      • 2017-06-15
      • 2013-12-10
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多