2022/03/24 今回の気になった bugs.ruby のチケット

今週は注釈付き代入演算子を提案するチケットなどがありました。

[Feature #18626] 注釈付き代入演算子 ()= の提案

  • 以下のような注釈付き代入演算子の提案になる
class Object
  # 代入するときの処理をフックする
  def self.()= (what)
    what.is_a? self or raise TypeRestrictionError
  end
end

# 代入する時に注釈を指定して定義する
age (Fixnum) = 30

# メソッドの引数にも定義できる
def add(a(Numeric), b(Numeric))
  a + b
end
add 1, "2" # raises TypeRestrictionError
  • この提案なんですが以下のような理由から Reject されています

文法的にも意味論的にも大変興味深い提案ですが、Ruby言語にいかなる形であれ型宣言や型注釈を導入するつもりはありません。すみません。

まつもと ゆきひろ /:|)

  • これは面白いなー既存の構文を壊さないようにしてなんか定義できないだろうか

[Feature #18644] Coerce anything callable to a Proc

  • 呼び出し可能オブジェクトを拡張するためのメソッドを追加する提案
  • #call メソッドを Proc 化する Object#to_proc
class Object
  # call メソッドを `Proc` オブジェクト化する
  def to_proc
    return method(:call).to_proc if respond_to?(:call)

    raise "Needs to respond to :call"
  end
end

class Proc
  def to_proc
    self
  end
end

callable.to_proc.curry[value]
  • 引数を Proc オブジェクト化する Kernel#Proc
class Kernel
  def Proc(value)
    if value.is_a?(::Proc)
      value
    elsif value.respond_to?(:call)
      value.method(:call).to_proc
    else
      raise "Needs to implement :call"
    end
  end
end

Proc(callable).curry[value]
  • #call メソッドがあるオブジェクトを Proc 化したいケースってどれぐらいあるんですかね

[Feature #18640] default empty string argument for String#sub and String#sub!, e.g. "hello".sub("l")

  • String#sub(pattern, replace)replace のデフォルト値を "" にする提案
# "hello".sub("l", "") と同じ意味になる
p "hello".sub("l")
# => "helo"
  • sub って名前なのに引数が1つしかないのがちょっと気持ち悪いなあ