[#47667] 文字列中に含まれる 8 進数表記 "\nnn" というパターンに正規表現でマッチさせたい — Kensuke Kaneko <kyanny@...>
金子健介と申します。
7 messages
2010/12/01
[#47684] ネットワークに流れるパケットのキャプチャーについて。 — Tetsuo Beppu <anfojp@...>
はじめまして。
5 messages
2010/12/10
[#47705] Windows(CP932)でのRuby1.9のirbの実行について — 中川貴 <nora1962@...>
はじめまして中川と申します。
4 messages
2010/12/22
[#47715] Windowsで1.9.2p136+zlibのインストール — AOKI Yoshihiro <aoki@...>
あおきと申します。
14 messages
2010/12/27
[#47716] Re: Windowsで1.9.2p136+zlibのインストール
— "U.Nakamura" <usa@...>
2010/12/27
こんにちは、なかむら(う)です。
[#47717] Re: Windowsで1.9.2p136+zlibのインストール
— AOKI Yoshihiro <aoki@...>
2010/12/27
あおきです。
[#47719] Re: Windowsで1.9.2p136+zlibのインストール
— "U.Nakamura" <usa@...>
2010/12/27
こんにちは、なかむら(う)です。
[#47720] Re: Windowsで1.9.2p136+zlibのインストール
— AOKI Yoshihiro <aoki@...>
2010/12/27
あおきです。
[ruby-list:47698] Re: Array#values_at behavior
From:
Kouya <kouyataifu4@...>
Date:
2010-12-15 14:21:22 UTC
List:
ruby-list #47698
kouya です。
array.c の value_at の実装をなんとなくみる限りでは、
Rangeオブジェクトが渡された場合にのみ、
範囲チェック関数rb_range_beg_lenを呼び出して、
begin が範囲外の場合はQnilを返し、次のセレクタの処理に移るといったように見えました。
ので、意図した動作(仕様?)なのだと思います。
// argc は selector の数
for (i=0; i<argc; i++) {
// argv[i] は i番目のselector
if (FIXNUM_P(argv[i])) {
rb_ary_push(result, (*func)(obj, FIX2LONG(argv[i])));
// selector がfixnum の場合は一つずつ要素を配列につっこむ。
continue;
}
/* check if idx is Range */
switch (rb_range_beg_len(argv[i], &beg, &len, olen, 0)) {
// rb_range_beg_len は beginが範囲内にないと Qnil をかえす。たぶん。
case Qfalse:
break;
case Qnil:
continue;
default:
for (j=0; j<len; j++) {
rb_ary_push(result, (*func)(obj, j+beg));
}
continue;
}
// continue するので、ここには到達しない。begin が範囲外の場合は無視されている。
rb_ary_push(result, (*func)(obj, NUM2LONG(argv[i])));
}
なお、ソースコードの使用例にもセレクターに二つ以上のRangeオブジェクトが指定できると書いてありました。
$ ruby-19-trunk -ve 'p [1,2,3].values_at(-4..3, 1..2, 0..10)'
ruby 1.9.3dev (2010-11-07 trunk 29711) [x86_64-darwin10.4.3]
[2, 3, 1, 2, 3, nil]
ですので、説明を書くならば、
「セレクターにRange オブジェクトを渡した場合、begin が範囲外の場合はその範囲は無視されます。
end が範囲外ならば、nil が代入され、それ以降の範囲は無視します。」
といったかんじでしょうか。
--
kouya