做 ~{do_something} 的可能方法?

Possible way to do `~{do_something}`?

我正在 crystal 中制作 DSL,我正在尝试获得类似于 ~{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 替换 {...} 但没有成功:

~ do; my_func; end

我得到了:

Syntax error in eval:11: expecting token 'EOF', not 'end'
  1. 你能解释一下为什么我会收到这些错误吗?
  2. 有没有办法让这个语法起作用?

~ 被解析为按位补码一元运算符(参见 language reference),它仅在对象上调用时作为方法名有效(foo.~)或使用了一个运算符(~foo,与前面的示例相同)。

在您的代码中,~ { my_func } 被解析为元组文字({my_func},将 Tuple(Nil) 键入 my_func returns nil),其中 ~ 运算符用在上面。由于 Tuple 没有实现该运算符(它不是二进制的,你不能对其进行按位补码),你会得到那个错误。对于第二个错误,do; code; end 块不能单独存在,所以你会得到语法错误。

我认为没有办法实现您想要的确切语法,请为您的 ~ 函数选择一个有效的方法名称。