- 右辺が , 区切りで複数ある場合には配列に変換される
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]
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
所感
参考リンク