我不會發布任何code
但在這裏的答案是什麼都做不到這是把原因。我在本地JS競技場工作,出現了一些問題,因爲我們無法寫入參數而沒有難看的黑客攻擊。
這是我的解決方案:
// Functions that return parameter data should be modified to return
// an array whose zeroeth member is the return value, all other values
// are their respective 1-based parameter index.
That doesn't mean define and return every parameter. Only the parameters that recieve output.
其原因的做法是這樣的:可能需要的任何數量的程序Multiple return values
。這就產生了一種情況,即具有命名值的對象(最終不會與所有操作的詞彙上下文同步),不斷地需要被記住以便適當地使用該過程。
使用規定的方法,您只需知道what you called
和where you should be looking
而不是必須知道您在尋找什麼。
還有一個優點是,「健壯和愚蠢的」可以編寫包圍所需的過程調用,以使此操作「更透明」的alogrithms。
這將是明智的使用object
,function
,或array
(所有這一切都是對象)作爲一個「回寫輸出」參數,但我相信,如果有多餘的工作一定要做,它應該由編寫該工具包的人來完成,以使事情更簡單,或擴展功能。
這是一個適合所有情況的答案,讓APIs
看起來應該在第一眼看起來,而不是看起來像和每個類似的意大利麪條編織掛毯,無法弄清楚的hobble-cobbled編織如果它是定義或數據。
恭喜,祝你好運。
我正在使用webkitgtk3和接口一些本地C庫特效。所以這個經過驗證的代碼示例至少可以用於說明目的。
// ssize_t read(int filedes, void *buf, size_t nbyte)
SeedValue libc_native_io_read (SeedContext ctx, SeedObject function, SeedObject this_object, gsize argument_count, const SeedValue arguments[], SeedException *exception) {
// NOTE: caller is completely responsible for buffering!
/* C CODING LOOK AND FEEL */
if (argument_count != 3) {
seed_make_exception (ctx, exception, xXx_native_params_invalid,
"read expects 3 arguments: filedes, buffer, nbyte: see `man 3 read' for details",
argument_count
); return seed_make_undefined (ctx);
}
gint filedes = seed_value_to_int(ctx, arguments[0], exception);
void *buf = seed_value_to_string(ctx, arguments[1], exception);
size_t nbyte = seed_value_to_ulong(ctx, arguments[2], exception);
SeedValue result[3];
result[0] = seed_value_from_long(ctx, read(filedes, buf, nbyte), exception);
result[2] = seed_value_from_binary_string(ctx, buf, nbyte, exception);
g_free(buf);
return seed_make_array(ctx, result, 3, exception);
}
尼克,我知道這是不久前,但我想我終於爲你[答](https://stackoverflow.com/a/48517986/1016343)。是的,你可以在JavaScript中完成輸出參數。 – Matt 2018-01-30 09:30:33