アカウント名:
パスワード:
IRubyでは配列の範囲外を参照しようとすると例外。本家、rubyではnil。C#やJava、VBでは例外を吐くので面喰いました
そんなの「未定義」のC/C++に比べたら可愛いもの。
オリジナルの仕様を採用しているPascalを使ってください、というかみんなそれを真似た処理系作ってくださいと言いたいコンパイル時に配列のレンジチェックをオンにすれば、ちゃんとランタイムエラーで安全にアボートしてくれますエラーをトラップしてリカバリーの出来る処理系もありますレンジチェックをオフにすれば速くなります
IRubyでは配列の範囲外を参照しようとすると例外。
IRubyを選んでいる時点でユーザーは処理速度など気にしていないのだから、rubyの仕様の方がありがたい
> ちゃんとランタイムエラーで安全にアボートしてくれます
それ単に例外がなかった時代の死に方であって、オリジナルというほどのものでもないと思う。
> レンジチェックをオフにすれば速くなります
でもたぶんPascalの仕様には違反してるよね。やっぱりC/C++は邪悪すぎる。
> IRubyを選んでいる時点でユーザーは処理速度など気にしていないのだから、rubyの仕様の方がありがたい
nilを返すにも結局境界チェックは必要だろ。
>nilを返すにも結局境界チェックは必要だろ。それがどうもCRubyの場合、境界チェックはしておらず、配列の最後にからの領域があるのでたまたまnilがかえって来ていたようです
http://code.kzakza.com/2011/09/ruby1-8-7-array-slice/ [kzakza.com]Ruby(1.8.7〜1.9.0)の配列の末尾には見えない要素があるらしい。
デマを飛ばすのはよくない。
ソースがRuby初心者のページじゃないですか。たとえ話を誤解して真に受けているようにしか見えないんですが。
そもそもそれだとa[100000]とかやったらどうなるのか?
インデックスが範囲外になった時にエラーにならないのは、自分が知っている範囲では他にPerlくらい?その仕様を使うコードって、率直に言ってあんまり良くないですよ。
JavaScriptもですよ
b = a[3] || ""
ってコードに何か問題があります?
添え字とは別の話だけれども、偽と判断される文字列が a[3] に入っていた時に意図しない動作になるのはよく見るね。おかげさんで // という演算子ができたが、C/C++ と両方を使っていると気分が悪い。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
犯人はmoriwaka -- Anonymous Coward
添え字がオーバーフローしたときの動作 (スコア:0)
IRubyでは配列の範囲外を参照しようとすると例外。本家、rubyではnil。
C#やJava、VBでは例外を吐くので面喰いました
Re:添え字がオーバーフローしたときの動作 (スコア:2, すばらしい洞察)
そんなの「未定義」のC/C++に比べたら可愛いもの。
Re: (スコア:0)
オリジナルの仕様を採用しているPascalを使ってください、というかみんなそれを真似た処理系作ってくださいと言いたい
コンパイル時に配列のレンジチェックをオンにすれば、ちゃんとランタイムエラーで安全にアボートしてくれます
エラーをトラップしてリカバリーの出来る処理系もあります
レンジチェックをオフにすれば速くなります
IRubyでは配列の範囲外を参照しようとすると例外。
IRubyを選んでいる時点でユーザーは処理速度など気にしていないのだから、rubyの仕様の方がありがたい
Re: (スコア:0)
> ちゃんとランタイムエラーで安全にアボートしてくれます
それ単に例外がなかった時代の死に方であって、オリジナルというほどのものでもないと思う。
> レンジチェックをオフにすれば速くなります
でもたぶんPascalの仕様には違反してるよね。やっぱりC/C++は邪悪すぎる。
> IRubyを選んでいる時点でユーザーは処理速度など気にしていないのだから、rubyの仕様の方がありがたい
nilを返すにも結局境界チェックは必要だろ。
Re: (スコア:0)
>nilを返すにも結局境界チェックは必要だろ。
それがどうもCRubyの場合、境界チェックはしておらず、配列の最後にからの領域があるのでたまたまnilがかえって来ていたようです
http://code.kzakza.com/2011/09/ruby1-8-7-array-slice/ [kzakza.com]
Ruby(1.8.7〜1.9.0)の配列の末尾には見えない要素があるらしい。
Re: (スコア:0)
デマを飛ばすのはよくない。
ソースがRuby初心者のページじゃないですか。
たとえ話を誤解して真に受けているようにしか見えないんですが。
そもそもそれだと
a[100000]とかやったらどうなるのか?
Re: (スコア:0)
インデックスが範囲外になった時にエラーにならないのは、自分が知っている範囲では他にPerlくらい?
その仕様を使うコードって、率直に言ってあんまり良くないですよ。
Re:添え字がオーバーフローしたときの動作 (スコア:1)
JavaScriptもですよ
Re: (スコア:0)
b = a[3] || ""
ってコードに何か問題があります?
Re: (スコア:0)
添え字とは別の話だけれども、偽と判断される文字列が a[3] に入っていた時に意図しない動作になるのはよく見るね。
おかげさんで // という演算子ができたが、C/C++ と両方を使っていると気分が悪い。