考虑以下代码:
OperatorTable addOperator(":", 2)
: := method(value,
list(self, value)
)
hash := "key": "value"
hash println
返回值应为list(key, value)
,并且在Io REPL中使用它时恰好是返回值。使用解释器时(如io somefile.io
中所示),返回的值为value
。经过一番检查后,差异在于:
# In the REPL
OperatorTable addOperator(":", 2)
message("k" : "v") # => "k" :("v")
# Via the Interpreter
OperatorTable addOperator(":", 2)
message("k" : "v") # => "k" : "v"
为什么会这样?
答案 0 :(得分:4)
文件执行发生在以下阶段:
因此,只有在第2阶段初始加载文件时才会发生操作符到消息转换。 当在第3阶段执行操作员注册码时,这已经发生了, 因此,运营商没有效果。
您可以设置手动加载文件的顺序,并将操作员定义放在第一个加载的文件中。
例如,有一个名为operators.io
的文件,其中包含在使用它们的文件之前加载的所有操作符定义。
答案 1 :(得分:2)
确认后,我得到了以下解决方案:
main.io:
doFile("ops.io")
doFile("script.io")
ops.io:
OperatorTable addOperator(":", 2)
: := method(value,
list(self, value))
script.io:
hash := "key": "value"
hash println
就像滴答解释一样,整个文件立即加载,因此您必须将其拆分,以便加载顺序保证运算符可用。