作者godfat (godfat 真常)
看板Ruby
标题Re: [连结] Superators Add New Operators to Ruby
时间Sun Sep 2 11:49:58 2007
※ 引述《yjc1 (..........)》之铭言:
: http://jicksta.com/articles/2007/08/29/superators-add-new-operators-to-ruby
: 非常有趣的东西.
老实讲看到这个我真的觉得很不可思议,因为那乍看之下根本不合 ruby 语法。
网页上也有一段 updated 说:
Update: There seems to be some confusion that Superators are a C extension
that modify Ruby’s internals. A valid Superator is actually just valid
Ruby—something we’ve had at our disposal this whole time!
看来不只是我觉得这很不可思议啊 XD
但是事实上证明只是我没搞清楚 ruby 的 operator binding 而已。
本来我是想直接翻 source code, 不过他写得满漂亮的,半夜翻看了一下,
觉得短时间内恐怕不容易看懂,尽管只有百来行而已。
先翻翻网页,看到这句话就了然了:
foo ++- bar
is equivalent to
foo.+(bar.-@().+@())
所以他必然是在 bar 底下开一个空间去存 operator,
对於 foo 的 binary operator 呼叫到时,再去检查是否 match pattern.
这个实做起来应该还算满复杂的,他一百行就写完确实满厉害的。
然而更重要的是,这也代表着 superator 有许许多多的缺点,
使得我觉得实际上这东西也只是好玩而无太多实用上的意义。
如作者也说了,对於 true, false, nil, Symbols or Fixnums, 这些
是无效的,因为他们本身就有那些 unary operator.
另一点则是他能支援的 pattern 被固定在只能有:
(binary operator)(unary operator)+
而 unary operator 在 ruby 里只有三种:+ - ~
意味着你的 pattern 一定得是一堆 +, -, 或是 ~...
於是这也许可以拿来做摩斯电码之类的﹍﹍
msg <<++--+-++--++--+++-+
msg <<--++--++-----+--+--
於是 + 表示长音,- 表示短音之类的﹍﹍
不过这样为何不乾脆写成这样:
msg << '++--+-++-....'
好像还是没什麽意义啊。
所以原本很同意这句:Dear demagogues of domain specificity!
我恐怕要收回来了 XD
不过最惨的应该还是,由於 operator 事实上还是分开的,
所以一定会有这种状况发生:
class Array
superator "<---" do |op|
self << op
end
end
s = 'XD'
-s
-s
-s
[] < s # => ['XD']
是真的很好玩没错啦,可以定义 ++ 去模仿 haskell,
只是实用性﹍﹍所以作者也强调:
I should note that I strongly frown upon any use of Superators outside
of the DSL space. Don’t use it in your company’s Rails app controllers.
Use it in your tenderly crafted Ruby DSLs where they make sense.
不过我在想,是否可以利用相似的概念,玩点别的东西?
--
「行け!Loki!」
(rocky ロッキー)
-Gurumin ぐるみん 王子? XD
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.135.28.18