2016-03-10 23 views
0

想实现这样的事情:是否有可能在数学中像终点符号一样在ruby中覆盖括号运算符?

arr = (1..10) 

arr[2,5] = [2,3,4,5] 
arr(2,5] = [3,4,5] 
arr[2,5) = [2,3,4] 
arr(2,5) = [3,4] 

好了,我们需要覆盖4个支架opreators:[],[)(],()

任何想法

这就是所谓的“包括或排除”在数学。https://en.wikipedia.org/wiki/Interval_(mathematics)#Including_or_excluding_endpoints

+0

尽管链接很有用,但您应该花时间将这些信息包含在您的问题中 - 这并不难解释。还要覆盖它首先必须存在的方法。只有数组[[]存在,另外三个'(]','[''''和'()'必须被创建。更不用说执行语法糖。 –

+0

不,您提出的语法并不能让Ruby解析器理解。 –

回答

0

总之,这是不可能的与当前的Ruby解析器。

稍长的答案:您必须先修改parse.y以支持您提出的语法并重新编译Ruby。这当然不是一个可怕的实用方法,因为每一个新的Ruby版本都必须这样做。更明智的做法是开始讨论ruby-core以查看是否有足够的兴趣将其作为语言的一部分(可能不是tbh)。

0

您想要的语法对于Ruby解析器无效,但可以通过自修改代码在Ruby中实现。

需要预处理源文件。一个简单的正则表达式可以用普通的方法的语法替换为您间隔表达式,即

arr[2,5] -> interval_closed(arr,2,5) 
arr(2,5] -> interval_left_open(arr,2,5) 
arr[2,5) -> interval_right_open(arr,2,5) 
arr(2,5) -> interval_open(arr,2,5) 

保持经修改的源的字符串可被评估和成为应用程序就像硬盘上的源文件的一部分。 (请参阅instance_eval

自修改代码的使用应该合理。

  • 增值是值得的努力和并发症?
  • 代码是否必须对其他程序员可读?
  • 预处理是否可行?例如。这种语法是否会出现在一个或几个独立的文件中,或传播到哪里?
相关问题