我从一个示例中复制了一些用于访问sqlite数据库的代码。它使用代理来获取返回的行:
check_db(input_line:STRING)
本地
df_db:SQLITE_DATABASE…
正如您正确指出的那样,目前,Eiffel中的局部变量不会自动传递到内联代理。解决方案是向内联代理添加显式的形式参数,并将相应的实际参数传递给它。
示例中的内联代理可以如下调整(带有参数的外部上下文) input_line 为简洁起见省略):
input_line
agent (returned_row: SQLITE_RESULT_ROW; s: STRING): BOOLEAN do -- `s` is attached to `input_line` here. if returned_row.is_null (1) then insert_into_db end end (?, input_line)
除了正式的论点 s 这将获得的价值 input_line ,您可以看到实际参数的明确列表 (?, input_line) 。问号表示一个开放的参数,将通过传递给代理 execute_with_arguments 像之前一样。 input_line 代表一个封闭的论点。
s
(?, input_line)
execute_with_arguments
当列表没有关闭的参数时,如原始代码中那样,它可以省略。但是,有人可以写 (?) 在关键字之后 end 原始代码中的内联代理是绝对明确的。
(?)
end