考虑这段代码:
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"
为什么会发生这种情况?
最佳答案
文件执行发生在这些阶段:
- 加载文件
- 根据当前运算符表替换运算符
- 执行内容
因此,运算符到消息的转换仅在文件最初在第 2 阶段加载时发生。 当运算符(operator)注册代码在第3阶段执行时,这已经发生了, 因此该运算符没有任何作用。
您可以设置手动加载文件的顺序,并将运算符定义放在加载的第一个文件中。
例如,有一个名为 operators.io
的文件,其中包含在使用它们的文件之前加载的所有运算符定义。
关于operators - 为什么 Io REPL 和解释器给我两个不同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10383065/