[ruby-dev:50209] [Ruby trunk Feature#13812] Refinements で定義した to_s を String interpolation が呼んでくれない
From:
shugo@...
Date:
2017-08-18 08:18:50 UTC
List:
ruby-dev #50209
Issue #13812 has been updated by shugo (Shugo Maeda).
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でも使えるようにしてもよいかもしれません。
最終的にはまつもとさんの判断になると思いますが、仕様変更の議論は英語でやった方がよいですかね。
----------------------------------------
Feature #13812: Refinements で定義した to_s を String interpolation が呼んでくれない
https://bugs.ruby-lang.org/issues/13812#change-66226
* Author: Anonymous
* Status: Assigned
* Priority: Normal
* Assignee: matz (Yukihiro Matsumoto)
* Target version:
----------------------------------------
はじめまして。谷道と申します。
既出だったらすみません。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]
```
```ruby
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/
--
https://bugs.ruby-lang.org/