内容は適当です。
今週と言っても今週みかけたチケットなだけでチケット自体は昔からあるやつもあります。
あくまでも『わたしが気になったチケット』で全ての bugs.ruby のチケットを載せているわけではありません。
- irb で
require
のファイル名補完をする機能の追加
irb(main):001:0" require "irb/<Tab> # <- Tab を押すとファイル名を補完してくれる
irb
に pry
の whereami
コマンドを追加する PR
whereami
すると binding.irb
した付近のコードを確認することができる
$ ruby /tmp/a.rb
From: /tmp/a.rb @ line 3 :
1: a = 1
2: @b = 2
=> 3: binding.irb
irb(main)[01:0]> a
=> 1
irb(main)[02:0]> @b
=> 2
irb(main)[03:0]> whereami
From: /tmp/a.rb @ line 3 :
1: a = 1
2: @b = 2
=> 3: binding.irb
=> nil
- pry の
whereami
コマンド知らなかった
- これはめっちゃ便利そう…
irb
に pry
の ls
コマンドを追加する PR
ls
すると引数オブジェクトのメソッド一覧やインスタンス一覧を出力してくれる
$ irb
irb(main):001:0> require "erb"
=> true
irb(main):002:0> ls ERB.new('test')
ERB#methods:
def_class def_method def_module encoding filename filename= lineno lineno=
location= make_compiler result result_with_hash run set_eoutvar src
instance variables: @_init @encoding @filename @frozen_string @lineno @src
=> nil
- 以下のように
^
を使ってパターンマッチに式をかけるようにする提案
user = { name: "homu", age: 14 }
case user
in { age: ^(7 + 7) }
end
- これが実装されてマージされた :tada:
- 早くパターンマッチ使いたい…
ENV
は普通は freeze
できないががんばれば freeze
できるという報告
ENV.freeze
Kernel.instance_method(:freeze).bind(ENV).call()
p ENV.frozen?
- 以下のように
Hash#transform_valies!
のブロック内で raise
するとレシーバは変わらない
hash = {a: 1, b: 2, c: 3}
a = hash.transform_values! { raise } rescue
p hash
- しかし
Hash#transform_keys!
の場合はレシーバが空になる
hash = {a: 1, b: 2, c: 3}
hash.transform_keys!(){ raise } rescue
p hash
Array#select!
のブロック内でレシーバを freeze
するとレシーバが空の配列になる
array = [1, 2, 3, 42]
array.select! do
array.freeze
false
end
p array
Array#uniq!
の場合は例外になりレシーバはそのままになる
array = [1, 2, 3, 42, 2, 3]
begin
array.uniq! do |item|
array.freeze
item
end
rescue => err
p err
end
p array
Array#select!
の方はバグということで修正された
array = [1, 2, 3, 42]
array.select! do
array.freeze
false
end
Array#sort!
のブロック内でレシーバを freeze
すると例外が発生するがソート済みになっているというバグ報告
array = [1, 2, 3, 4, 5]
begin
array.sort! do |a, b|
array.freeze if a == 3
1
end
rescue => err
p err
end
p array
- ちなみに
break
した場合はそこまでのソートになっている
array = [1, 2, 3, 4, 5]
array.sort! do |a, b|
break if a == 3
1
end
p array
- バックトレースに引数情報も追加する提案
- 例えば以下のようなコードを実行すると
def say_hi(person)
puts message(person)
end
def message(person)
"hi: #{person.name}"
end
say_hi(nil)
/tmp/vTaZxJg/70:6:in `message': undefined method `name' for nil:NilClass (NoMethodError)
from hi.rb:2:in `say_hi'
from hi.rb:9:in `<main>'
hi.rb:6:in `message': undefined method `name' for nil:NilClass (NoMethodError)
from hi.rb:2:in `say_hi' called with NilClass
from hi.rb:9:in `<main>' called with NilClass
- どのような表記にするのか(クラスだけ?値は必要がない?複数の引数の場合は?)やパフォーマンス的な懸念点がないか議論されている
- 以下のように
Enumerable#tally
に引数を渡してそれに結果を集計していくような提案
h = {}
[:a,:b,:c].tally(h)
[:a,:b,:d].tally(h)
p h
- 便利な気がするけど引数が変更されてしまうのはなんかちょっと気持ち悪い…