2017-03-05 71 views
0

我做在水晶一個DSL,而我試圖讓一個語法像~{do_something}可能的方法來做`〜{do_something}`?

我想是這樣的:

def ~(&block) 
    block.call 
end 

def my_func 
    puts "hello" 
end 

~ { my_func } 

但我得到的是這樣的錯誤:

Error in line 11: undefined method '~' for Tuple(Nil) 

https://carc.in/#/r/1oyv

我試圖與do; ...; end取代{...}而不畝CH成功:

~ do; my_func; end 

而且我得到了:

Syntax error in eval:11: expecting token 'EOF', not 'end' 
  1. 你能解釋一下爲什麼我收到論文的錯誤?
  2. 有沒有辦法讓這個語法工作?

回答

2

~被解析爲一個按位求補一元運算符(見language reference),它僅當被調用的對象(foo.~)上或用於操作者(~foo方法名稱有效,確實相同前面的例子)。

在代碼中,~ { my_func }被解析爲與在其上使用的操作者~一個元組文字({my_func},類型Tuple(Nil)my_func返回nil)。由於Tuple沒有實現該運算符(它不是二進制的,你不能對它進行按位補充),你會得到那個錯誤。對於第二個錯誤,do; code; end塊不能獨立存在,因此您會收到上述語法錯誤。

我不認爲有一種方法來實現你想要的確切語法,爲你的~函數選擇一個有效的方法名稱。

+0

謝謝,目前我回退到類似:'var =〜MyObj.new {my_func}' – bew

相關問題