Eki*_*bal 4 ruby ruby-on-rails
假设我有一个数组:[{one: 1, two: 2}, {one: 5, two: 6}],我想使用sort_by之类的东西:
[1] pry(main)> [{one: 1, two: 2}, {one: 5, two: 6}].sort_by{|x| [x[:one], x[:two]]}
Run Code Online (Sandbox Code Playgroud)
但是,当我为其中一个值引入nil时,我得到ArgumentError: comparison of Array with Array failed:
=> [{:one=>1, :two=>2}, {:one=>5, :two=>6}]
[2] pry(main)> [{one: 1, two: 2}, {one: nil, two: 6}].sort_by{|x| [x[:one], x[:two]]}
ArgumentError: comparison of Array with Array failed
Run Code Online (Sandbox Code Playgroud)
如何避免此错误?
使用此语法,
starred.sort_by { |a| [a ? 1 : 0, a] }
Run Code Online (Sandbox Code Playgroud)
当必须比较两个元素时,它将比较一个数组。当Ruby比较数组(调用===方法)时,它将比较第一个元素,并且仅在第一个元素相等时才转到第二个元素。? 1 : 0保证我们将Fixnum作为第一个元素,因此应该没有错误。
如果这样做? 0 : 1,nil将出现在数组的末尾而不是开头。这是一个例子:
irb> [2, 5, 1, nil, 7, 3, nil, nil, 4, 6].sort_by { |i| [i ? 1 : 0, i] }
=> [nil, nil, nil, 1, 2, 3, 4, 5, 6, 7]
Run Code Online (Sandbox Code Playgroud)
来源。