Project

General

Profile

Feature #13812

Refinements で定義した to_s を String interpolation が呼んでくれない

Added by Anonymous about 1 month ago. Updated 8 days ago.

Status:
Closed
Priority:
Normal
Target version:
-
[ruby-dev:50200]

Description

はじめまして。谷道と申します。

既出だったらすみません。bugs.ruby-lang.org でも検索したんですが
それっぽいチケットが見当たらなかったので確認させてください。

Refinements で定義した to_s を String interpolation が呼んでくれないのですが、これって仕様なんですかね?
String literal の評価が using B しているスコープの外で行われる、ということでしょうか。

$ ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16]
class A
end

module B
  refine A do
    def to_s
      'b'
    end
  end
end

class C
  using B

  def initialize
    @a = A.new
  end

  def c1
    @a.to_s
  end

  def c2
    "#{@a}"
  end

  def c3
    puts "#{@a}"
  end
end

puts C.new.c1 #=> b
puts C.new.c2 #=> #<A:0x007fb05ba3e928>
C.new.c3 #=> #<A:0x007fb05ba3e7e8>

c1, c2, c3 ともに "b" となることを想像していました。

--
谷道 創(Tsukuru Tanimichi)
https://ttanimichi.com/

Associated revisions

Revision 59950
Added by nobu (Nobuyoshi Nakada) 8 days ago

refinements in string interpolation

  • compile.c (iseq_compile_each0): insert to_s method call, so that
    refinements activated at the caller should take place.
    [Feature #13812]

  • insns.def (tostring): fix up converted object to a string,
    infect and fallback.

  • insns.def (branchiftype): new instruction for conversion.
    branches if TOS is an instance of the given type.

History

#1 [ruby-dev:50203] Updated by hsbt (Hiroshi SHIBATA) about 1 month ago

  • Assignee set to shugo (Shugo Maeda)
  • Status changed from Open to Assigned

#2 [ruby-dev:50204] Updated by Anonymous about 1 month ago

あ、もしかしてバグでした?英語で ruby-core に投げた方が良かったかな。
ruby-lang.org のメーリスに投げるの初めてで、慣習がよく分かってないです、すみません。

--
谷道 創(Tsukuru Tanimichi)
https://ttanimichi.com/

#3 [ruby-dev:50205] Updated by nobu (Nobuyoshi Nakada) about 1 month ago

  • Backport deleted (2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN)
  • Description updated (diff)
  • Tracker changed from Bug to Feature

#4 [ruby-dev:50206] Updated by hsbt (Hiroshi SHIBATA) about 1 month ago

谷道さん

引き続き、メーリングリストで議論していただいて構いません。
Refinements については shugomaeda さんが担当となっているため、assign を明確にする意図でメールの内容を issue チケットとしてこちらの tracker に登録しておきました。

#5 [ruby-dev:50209] Updated by shugo (Shugo Maeda) about 1 month ago

  • Assignee changed from shugo (Shugo Maeda) to matz (Yukihiro Matsumoto)

匿名ユーザー wrote:

既出だったらすみません。bugs.ruby-lang.org でも検索したんですが
それっぽいチケットが見当たらなかったので確認させてください。

Refinements で定義した to_s を String interpolation が呼んでくれないのですが、これって仕様なんですかね?
String literal の評価が using B しているスコープの外で行われる、ということでしょうか。

Refinements導入時の議論で暗黙のメソッド呼び出しには影響しないようにするという判断が
ありましたが、その後一部の暗黙のメソッド呼び出しには影響するようになったので
string interpolationでも使えるようにしてもよいかもしれません。

最終的にはまつもとさんの判断になると思いますが、仕様変更の議論は英語でやった方がよいですかね。

#6 [ruby-dev:50210] Updated by ttanimichi (Tsukuru Tanimichi) about 1 month ago

shugo さん

Refinements導入時の議論で暗黙のメソッド呼び出しには影響しないようにするという判断が
ありましたが、その後一部の暗黙のメソッド呼び出しには影響するようになったので
string interpolationでも使えるようにしてもよいかもしれません。

なるほど。

仕様変更の議論は英語でやった方がよいですかね。

英語で新規にチケットを起票した方が良いでしょうか?
それともこのチケットの Title と Description を編集して英語に書き換えた方がいいですか?

#7 [ruby-dev:50211] Updated by matz (Yukihiro Matsumoto) about 1 month ago

そうですね。
先に答えを出しておくと、この場合のto_sは(そのコンテキストでの呼び出しと解釈できるので)refinementの対象になったほうが良いように思います。

Matz.

#8 [ruby-dev:50253] Updated by ttanimichi (Tsukuru Tanimichi) 9 days ago

hsbt さん

RubyKaigi でお忙しいところすみません、
hsbt さんに聞くのが適切か分かりませんが、もしよろしければ相談させてください。

本件、すでに nobu さんのパッチがあり、
まつもとさんの承認も得られていますが、どうされますか?

仕様変更の議論なので英語でやった方が良かったかなとも思うんですが、
既にまつもとさんの承認も得られていますし、こういう場合って普段どうされてます?
また、英語で議論する場合、

英語で新規にチケットを起票した方が良いでしょうか?
それともこのチケットの Title と Description を編集して英語に書き換えた方がいいですか?

これってどちらが良いでしょうか?

個人的な想いとしては、2.5 リリースに間に合うと嬉しいです。

#9 Updated by nobu (Nobuyoshi Nakada) 8 days ago

  • Status changed from Assigned to Closed

Applied in changeset trunk|r59950.


refinements in string interpolation

  • compile.c (iseq_compile_each0): insert to_s method call, so that
    refinements activated at the caller should take place.
    [Feature #13812]

  • insns.def (tostring): fix up converted object to a string,
    infect and fallback.

  • insns.def (branchiftype): new instruction for conversion.
    branches if TOS is an instance of the given type.

Also available in: Atom PDF