做 ~{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)
我尝试用 do; ...; end
替换 {...}
但没有成功:
~ do; my_func; end
我得到了:
Syntax error in eval:11: expecting token 'EOF', not 'end'
- 你能解释一下为什么我会收到这些错误吗?
- 有没有办法让这个语法起作用?
~
被解析为按位补码一元运算符(参见 language reference),它仅在对象上调用时作为方法名有效(foo.~
)或使用了一个运算符(~foo
,与前面的示例相同)。
在您的代码中,~ { my_func }
被解析为元组文字({my_func}
,将 Tuple(Nil)
键入 my_func
returns nil),其中 ~
运算符用在上面。由于 Tuple
没有实现该运算符(它不是二进制的,你不能对其进行按位补码),你会得到那个错误。对于第二个错误,do; code; end
块不能单独存在,所以你会得到语法错误。
我认为没有办法实现您想要的确切语法,请为您的 ~
函数选择一个有效的方法名称。
我正在 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)
我尝试用 do; ...; end
替换 {...}
但没有成功:
~ do; my_func; end
我得到了:
Syntax error in eval:11: expecting token 'EOF', not 'end'
- 你能解释一下为什么我会收到这些错误吗?
- 有没有办法让这个语法起作用?
~
被解析为按位补码一元运算符(参见 language reference),它仅在对象上调用时作为方法名有效(foo.~
)或使用了一个运算符(~foo
,与前面的示例相同)。
在您的代码中,~ { my_func }
被解析为元组文字({my_func}
,将 Tuple(Nil)
键入 my_func
returns nil),其中 ~
运算符用在上面。由于 Tuple
没有实现该运算符(它不是二进制的,你不能对其进行按位补码),你会得到那个错误。对于第二个错误,do; code; end
块不能单独存在,所以你会得到语法错误。
我认为没有办法实现您想要的确切语法,请为您的 ~
函数选择一个有效的方法名称。