2020/08/20 今週の気になった bugs.ruby
内容は適当です。
今週と言っても今週みかけたチケットなだけでチケット自体は昔からあるやつもあります。
[Misc #17041] DevelopersMeeting20200826Japan
- 来週水曜日に開発者会議があります
- 気になるチケットがあれば上記のチケットにコメントしておきましょう
[Feature #17122] Add category to Warning#warn
Warning.#warn
にcategory:
キーワード引数を追加する提案
module Warning # def self.warn(msg, category: nil) # deprecated 警告の場合に raise する if category == :deprecated raise msg else super end end end def ivar Object.new.instance_variable_get(:@ivar) end # 例外エラーは発生しないが警告は出る ivar # 例外エラーになる Object.new.tainted?
- 警告の種類によって挙動を制御できるのは便利そう
- ただ、実装を見る限り現状は
deprecated
しかなさそう? - そもそも
category
という概念は今のWarning
にも存在してWarning[category] = false
みたいに制御できる- その上で現状は
category
がdeprecated
しかなさそう
- その上で現状は
- 今回の提案としては『特定の category の警告だった場合にアプリケーション側で制御することができるようにする』という意図になる
warn
に引数が増えるので非互換になるのがちょっと気になる- 既存の
def self.warn(msg)
で定義されているメソッドにcategory:
を渡すとエラーになる
- 既存の
RubyのナンパラでSEGV - ゲームリンクスの徒然なる日常
- bugs.ruby とは関係ないんですがつらそうな問題だったので紹介
[1, 2, 3, 4].map{ _1 **3 }
すると segv する内容の記事[1, 2, 3, 4].map{ _1 ** 3 }
みたいにスペースを置くと OK
- このコードには2つ問題がある
_1 *1
が _1(*1)
と解釈される問題
- 通常だと変数
a
が定義されていればa *1
はa.* 1
と解釈される- メソッド
a
だけならa(*1)
、変数a
と両方定義さていればa.* 1
になる
- メソッド
- しかし
_1
の場合は必ず_1(*1)
として解釈される - この問題に対するチケットはあったが
_1
は将来的にメソッドとして定義できなくなる、という理由で Close - 2.8.0-dev だと
_1
の変数やメソッドは定義するとエラーになるがdefine_method(:_1)
だと依然として定義できるのでやっぱりなにかしらの対応は必要な気がする
define_method(:_1) { |a| a + a } p self.then { _1 1 } # => 2
- CRuby のパーサ読んでみたけどなにもわからない