Project

General

Profile

Feature #13812

Updated by nobu (Nobuyoshi Nakada) over 6 years ago

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

 
 
  既出だったらすみません。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/ 

Back