assert_equal のためだけに限らず、
if 文で == を使うときいつもと違う振舞いをします。

require 'narray'
a = NArray[0]
puts 'Oops' if a == NArray[1]
puts 'Oops' if a == 1
puts 'Oops' if a == [1]

! で条件をひっくり返せないのも奇妙に思えます。

提案ですが、Ruby の慣習に従って == と true/false/例外 を
返すようにしてはどうでしょうか。今までの NArray の実装の == は
別名をつけることにして…

るびきちさん:
> irb(main):002:0> NArray[1,2] == NArray[1,2]
> NArray.byte(2): 
> ^@[ 1, 1 ]
> irb(main):003:0> NArray[1,2] == NArray[1,3]
> NArray.byte(2): 
> ^@[ 1, 0 ]
> ではなくてそれぞれ
> [true, true] と [false, false] を返した方がいいような気もしてきました。

その案でも、やはり
puts 'Oops' if NArray[1, 2] == NArray[1,3]
               # => [false, false] は nil でも false でもないので真
のような気がします。

等しかったらその場所に 1 が、等しくなければ 0 が入るという比較が
必要になることもあるかもしれないので、
そのような比較は == じゃない名前だったらなあと思いますがどうですか。
--
池上 大介
Daisuke IKEGAMI <daisu-ik / is.aist-nara.ac.jp>
奈良先端科学技術大学院大学 情報科学研究科
情報処理学専攻 情報基礎学講座 関研究室