![]() ![]() ![]() ![]() |
![]() |
|
![]() |
||
![]() |
% irb 2.5.0 :001 > a=[1,[2,[3,[4]]]] => [1, [2, [3, [4]]]] 2.5.0 :002 > a.dig(1,1,1) => [4] 2.5.0 :003 > a.dig(1,1) => [3, [4]] 2.5.0 :004 > a.dig(1) => [2, [3, [4]]] 2.5.0 :005 > a.dig() Traceback (most recent call last): 3: from /path/to/rvm/rubies/ruby-2.5.0/bin/irb:11:in `<main>' 2: from (irb):5 1: from (irb):5:in `dig' ArgumentError (wrong number of arguments (given 0, expected 1+))
そこ、エラーにすべき理由ってある?
digの存在忘れて下のようなオレオレdig書いてた自分としては、そこはselfを返してほしいなと。
module Diggable def dig(*a) a.inject(self, :[]) end end
Ruby 2.0からOnigmoが採用され、新たなメタキャラクタ「\K」が使えるようになった。
http://doc.ruby-lang.org/ja/2.0.0/doc/spec=2fregexp.html の「先読み、後読み(lookahead, lookbehind)」を参照。
しかしこの\K、Regexp#gsub と使うと何か挙動がおかしい。
% irb-ruby-2.0.0-p247 2.0.0p247 :001 > a="foobarbazquux/foobarbazquux" => "foobarbazquux/foobarbazquux" 2.0.0p247 :002 > a.sub(/foo\Kbar/, "") => "foobazquux/foobarbazquux" 2.0.0p247 :003 > a.gsub(/foo\Kbar/, "") => "bazquux/bazquux"
\Kの採用元であるPerlの方は期待通りの挙動を示している。
% perl --version|head -2 This is perl 5, version 16, subversion 3 (v5.16.3) built for i686-linux % tinyrepl re.pl$ my $a = "foobarbazquux/foobarbazquux"; "foobarbazquux/foobarbazquux" re.pl$ $a =~ s/foo\Kbar//r; "foobazquux/foobarbazquux" re.pl$ $a =~ s/foo\Kbar//gr; "foobazquux/foobazquux"
2.1.0-preview1で直ったようです。
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/47694
https://bugs.ruby-lang.org/issues/8856
% irb-ruby-2.1.0-preview1 irb(main):001:0> a="foobarbazquux/foobarbazquux" => "foobarbazquux/foobarbazquux" irb(main):002:0> a.sub(/foo\Kbar/, "") => "foobazquux/foobarbazquux" irb(main):003:0> a.gsub(/foo\Kbar/, "") => "foobazquux/foobazquux"
パッチ見る限り、Onigmoは関係なかったようで。
https://github.com/ruby/ruby/commit/b31965cb43e8f6117435acf6f676cb9a4417afff
Onigmoの方を疑ってしまい申し訳ありませんでした。
1.9.3-p327 :001 > require 'uri' => true 1.9.3-p327 :002 > URI.encode_www_form([["a", "A"], ["b", "c"], ["a", "AAA"]]) => "a=A&b=c&a=AAA" 1.9.3-p327 :004 > URI.decode_www_form("1=2&3=z&1=z&2=222") => [["1", "2"], ["3", "z"], ["1", "z"], ["2", "222"]] 1.9.3-p327 :005 > URI.decode_www_form("a=&b=") => [["a", ""], ["b", ""]]
問題はここから。
1.9.3-p327 :006 > URI.encode_www_form([["a", ""], ["b"]]) => "a=&b" 1.9.3-p327 :007 > URI.decode_www_form("a=&b") ArgumentError: invalid data of application/x-www-form-urlencoded (a=&b) (略)
もちろん(えっ)Rubyでは左辺値ではありません。
(Perl 5.14.2) % perl -e '$a=1;$b=2;$c=3;($c ? $a : $b) = 1010; print "$a,$b,$c\n"' 1010,2,3 % perl -e '$a=1;$b=2;$c=0;($c ? $a : $b) = 1010; print "$a,$b,$c\n"' 1,1010,0
(Ruby 1.9.3) % ruby -e 'a=1;b=2;c=0;(c ? a : b) = 1010; p [a,b,c]' ruby 1.9.3p0 (2011-10-30 revision 33570) [i486-linux] -e:1: syntax error, unexpected '=', expecting $end a=1;b=2;c=0;(c ? a : b) = 1010; p [a,b,c] ^
今からでも遅くないので2.0に入れませんか?w
yyamasak2012/03/10 00:05(c ? a : b)が返すのはFixnumオブジェクトなので、2=1010って意味わかんないんですけど、というのがRuby的な考えだと思います。
まあ考えてみたら当たり前のことなんだけど。
PerlのEncodeに慣れてからRuby 1.9に来ると、Perlの内部エンコードおよびdecode()に該当するのがなくてちょっと混乱するよね、と。
でも、Stringは自分達のエンコード形式を知っているんだから、結合のときによきにはからってくれてもいいじゃんとか思ってしまうw
…UTF-8に揃えろってことですね、わかります。
(enctest) #!/usr/bin/ruby1.9.1 # coding: utf-8 require './enctest-euc.rb' UTF = "UTF" begin puts UTF + EUC rescue => e puts e end puts UTF + EUC.encode("utf-8") (enctest-euc.rb) # -*- coding: euc-jp -*- EUC = "EUC" (実行結果) % ./enctest incompatible character encodings: UTF-8 and EUC-JP UTFEUC