Feature #13812
closedRefinements で定義した to_s を String interpolation が呼んでくれない
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/
Updated by hsbt (Hiroshi SHIBATA) about 7 years ago
- Status changed from Open to Assigned
- Assignee set to shugo (Shugo Maeda)
Updated by Anonymous about 7 years ago
あ、もしかしてバグでした?英語で ruby-core に投げた方が良かったかな。
ruby-lang.org のメーリスに投げるの初めてで、慣習がよく分かってないです、すみません。
--
谷道 創(Tsukuru Tanimichi)
https://ttanimichi.com/
Updated by nobu (Nobuyoshi Nakada) about 7 years ago
- Tracker changed from Bug to Feature
- Description updated (diff)
- Backport deleted (
2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN)
Updated by hsbt (Hiroshi SHIBATA) about 7 years ago
谷道さん
引き続き、メーリングリストで議論していただいて構いません。
Refinements については shugomaeda さんが担当となっているため、assign を明確にする意図でメールの内容を issue チケットとしてこちらの tracker に登録しておきました。
Updated by shugo (Shugo Maeda) about 7 years 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でも使えるようにしてもよいかもしれません。
最終的にはまつもとさんの判断になると思いますが、仕様変更の議論は英語でやった方がよいですかね。
Updated by ttanimichi (Tsukuru Tanimichi) about 7 years ago
shugo さん
Refinements導入時の議論で暗黙のメソッド呼び出しには影響しないようにするという判断が
ありましたが、その後一部の暗黙のメソッド呼び出しには影響するようになったので
string interpolationでも使えるようにしてもよいかもしれません。
なるほど。
仕様変更の議論は英語でやった方がよいですかね。
英語で新規にチケットを起票した方が良いでしょうか?
それともこのチケットの Title と Description を編集して英語に書き換えた方がいいですか?
Updated by matz (Yukihiro Matsumoto) about 7 years ago
そうですね。
先に答えを出しておくと、この場合のto_sは(そのコンテキストでの呼び出しと解釈できるので)refinementの対象になったほうが良いように思います。
Matz.
Updated by ttanimichi (Tsukuru Tanimichi) about 7 years ago
hsbt さん
RubyKaigi でお忙しいところすみません、
hsbt さんに聞くのが適切か分かりませんが、もしよろしければ相談させてください。
本件、すでに nobu さんのパッチがあり、
まつもとさんの承認も得られていますが、どうされますか?
仕様変更の議論なので英語でやった方が良かったかなとも思うんですが、
既にまつもとさんの承認も得られていますし、こういう場合って普段どうされてます?
また、英語で議論する場合、
英語で新規にチケットを起票した方が良いでしょうか?
それともこのチケットの Title と Description を編集して英語に書き換えた方がいいですか?
これってどちらが良いでしょうか?
個人的な想いとしては、2.5 リリースに間に合うと嬉しいです。
Updated by nobu (Nobuyoshi Nakada) about 7 years 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.
Updated by ttanimichi (Tsukuru Tanimichi) about 7 years ago
ruby 2.5.0preview1 で期待通り動いていることを確認できました。ありがとうございました。