新宿(近々代々木に移転)で働く18歳エンジニアのブログ

思ったこととか、技術的なこと書きます。

rubyで最近へーと思った箇所まとめ

  • 右辺が , 区切りで複数ある場合には配列に変換される
a = 1, 2 => [1, 2]
a.class => Array
  • 右辺の要素の残り全部を配列として受け取ることもできる
a, *b = 1, 2, 3 => [1, 2, 3]
a.class => Integer
b.class => Array
  • 全部捨てる←これは笑った
[11] pry(main)> * = 1, 2, 3 => [1, 2, 3]
  • hashは通常、一つの値として代入されるが、* をつけると Hash#to_a されて多重代入できるようになる
a = { a: 1, b: 2 } 
=> {:a=>1, :b=>2}
a 
=> {:a=>1, :b=>2}
a, b = { a: 1, b: 2 } 
=> {:a=>1, :b=>2}
a 
=> {:a=>1, :b=>2}
b 
=> nil
a.class 
=> Hash
b.class 
=> NilClass
a = *{ a: 1, b: 2 } 
=> [[:a, 1], [:b, 2]]
a.class 
=> Array
a 
=> [[:a, 1], [:b, 2]]
a, b = *{ a: 1, b: 2 } 
=> [[:a, 1], [:b, 2]]
a.class 
=> Array
a 
=> [:a, 1]
b 
=> [:b, 2]
b.class 
=> Array
  • FixnumクラスとBignumクラスがIntegerクラスに統合された いつもこのwarningが出てて、その原因がわかってすっきり
/app/vendor/bundle/ruby/2.4.0/gems/middleman-core-4.1.10/lib/middleman-core/sitemap/resource.rb:88: warning: constant ::Fixnum is deprecated
/app/vendor/bundle/ruby/2.4.0/gems/sprockets-3.7.0/lib/sprockets/digest_utils.rb:47: warning: constant ::Fixnum is deprecated
/app/vendor/bundle/ruby/2.4.0/gems/sprockets-3.7.0/lib/sprockets/digest_utils.rb:51: warning: constant ::Bignum is deprecated
/app/vendor/bundle/ruby/2.4.0/gems/sprockets-3.7.0/lib/sprockets/processor_utils.rb:110: warning: constant ::Fixnum is deprecated
/app/vendor/bundle/ruby/2.4.0/gems/sprockets-3.7.0/lib/sprockets/processor_utils.rb:111: warning: constant ::Bignum is deprecated
/app/vendor/bundle/ruby/2.4.0/gems/concurrent-ruby-1.0.2/lib/concurrent/map.rb:206: warning: constant ::Fixnum is deprecated
  • sumメソッド、引数で初期値変更、アルゴリズム的に、+より誤差が少ない、少数は誤差発生
[0.1, 0.1, 0.1].sum
=> 0.30000000000000004
['foo', 'bar'].sum('')
=> "foobar"
[[1, 2], [3, 1, 5]].sum([])
=> [1, 2, 3, 1, 5]
  • 2.3.0~ digコマンド
h = { foo: {bar: {baz: 1}}}
=> {:foo=>{:bar=>{:baz=>1}}}
h.dig(:foo, :bar, :baz)
=> 1
h.dig(:foo, :zot, :xyz)
=> nil
From: hash.c (C Method):
Owner: Hash
Visibility: public
Number of lines: 9

VALUE
rb_hash_dig(int argc, VALUE *argv, VALUE self)
{
    rb_check_arity(argc, 1, UNLIMITED_ARGUMENTS);
    self = rb_hash_aref(self, *argv);
    if (!--argc) return self;
    ++argv;
    return rb_obj_dig(argc, argv, self, Qnil);
}
From: array.c (C Method):
Owner: Array
Visibility: public
Number of lines: 9

VALUE
rb_ary_dig(int argc, VALUE *argv, VALUE self)
{
    rb_check_arity(argc, 1, UNLIMITED_ARGUMENTS);
    self = rb_ary_at(self, *argv);
    if (!--argc) return self;
    ++argv;
    return rb_obj_dig(argc, argv, self, Qnil);
}
  • &. safe navigation operator nilでもNoMethodErrorにならずにnilを返してくれる
[18] pry(main)> str = nil
=> nil
[19] pry(main)> str.upcase
NoMethodError: undefined method `upcase' for nil:NilClass
from (pry):10:in `__pry__'
[20] pry(main)> str&.upcase
=> nil

所感

  • rubyjavaとかに型とかのキャストの柔軟性とかが比べてすごい!!
  • C言語勉強して、rubyの裏も読めたらいいなー
  • *強い

参考リンク