2011-01-04 31 views

答えて

61
li.delete_at(li.index(n) || li.length) 

li[li.length]範囲外であるため、|| li.lengthnがリストにない場合を扱います。

irb(main):001:0> li = [1,2,3,1,2,3] 
=> [1, 2, 3, 1, 2, 3] 
irb(main):002:0> li.delete_at(li.index(2) || li.length) 
=> 2 
irb(main):003:0> li.delete_at(li.index(42) || li.length) 
=> nil 
irb(main):004:0> li 
=> [1, 3, 1, 2, 3] 
+0

ありがとうございます。私はこれをエレガントに表現しようと頭を打ちました。 –

+0

私は '|| li.length'誰でも説明できます – gates

+1

ruby​​の値はブール値として扱うことができ、 'false'と' nil'だけがfalseに評価されます。二重パイプのシンタックスは便利な省略表現です。 'a || 「b」は「a、それが無ければ、次にb」を意味する。 – erich2k8

12

|| li.lengthは(TypeError例外につながることになる)li.delete_atnilを送るのを避けるためにある場合は、より読みやすいバージョンは、この

li.delete_at li.index(42) unless li.index(42).nil?

+6

おそらく 'li.index(42)'を変数に格納して、検索を2回行わないようにしたいとします。パフォーマンスは、大規模なアレイではるかに優れています。 – Kelvin

4

ように見えるかもしれません多分それはSTDLIBの一部になる必要があります:

class Array 
    def delete_first item 
    delete_at(index(item) || length) 
    end 
end 
関連する問題