Project

General

Profile

Feature #18626

Updated by takiuchi (Genki Takiuchi) about 2 years ago

型制約を実現するために以下のような注釈付き代入演算子を提案します。 

 ``` 
 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 
 ``` 

 左辺値の後に`(...)` が続いた場合に`()`内の値に対して`()=`演算子を呼び出します。 
 Rubyはメソッドの返り値が左辺値になることは無いので既存の文法とは衝突しないかなと。 

 以下のようなenum的な制約も便利だと思います。 

 ``` 
 class Array 
   def ()= (what) 
     self.include? what or raise ValueRestrictionError 
   end 
 end 

 flag([1,2,3]) = 3 
 ``` 

 いかがでしょうか。

Back