我在Apple的Swift 2.1编程语言指南中看到了这段代码
func makeIncrementer() -> ((Int) -> Int) {
func addOne(number: Int) -> Int {
return 1 + number
}
return addOne
}
var increment = makeIncrementer()
increment(7)
虽然我确实理解内部函数的范围在其执行块之外是如何可用的 - 感谢this,我无法理解如何传递 7 < 作为 increment() 的参数实际上被视为内部函数的参数,当 increment() 实际指向外部函数。
我还想知道 makeIncrementer() 何时实际执行?它是在分配给 increment() 时还是 increment() 获取参数时?/ p>
答案 0 :(得分:1)
makeIncrementer()
在执行此操作时完全执行:
var increment = makeIncrementer()
默认情况下,Swift是一种渴望(而不是懒惰)的语言。您可以通过在各个点添加print
语句来探索所有这些。
答案 1 :(得分:1)
我无法理解当increment()实际指向外部函数时,如果将作为参数传递给increment()的内容实际上被视为内部函数的参数。
increment
变量实际上指向内部函数(addOne()
),因为那是您从makeIncrementer()
返回的内容。因此,当您致电addOne()
时会调用increment(7)
。
我还想知道makeIncrementer()实际执行的时间?
一旦你打电话就会执行:
var increment = makeIncrementer()
答案 2 :(得分:1)
前6行定义了一个函数function bportal_tesst_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'document_node_form') {
$form['field_document_file']['und'][0]['#upload_validators']['custom_document_upload_validation'] = array();
}
return $form;
}
function custom_document_upload_validation($file) {
$filename = $file->filename;
$errors = array();
if (file_exists('/var/www/vhosts/BP/docroot/sites/default/files-private/documents/'.$filename)) {
print_r($filename);
$errors[] = t("The new file already exists. Please use a different name.");
drupal_add_js(drupal_get_path('module','bportal_tesst') . '/js/pop-in.js');
}
return $errors;
}
,它不带参数并返回一个值。与任何其他函数一样,它在第7行使用makeIncrementer
调用。
该函数的返回值恰好是makeIncrementer()
类型的另一个函数。这意味着返回的函数采用类型为(Int) -> (Int)
的参数,并返回类型为Int
的值。
在第7行,返回的值(Int
函数)被分配给(Int)->(Int)
。
因此,第8行,increment
变量现在代表一个函数,它接受increment
并返回Int
。与任何其他函数一样,它使用括号和适当的参数调用:Int
。
注意:由于未分配increment(7)
的返回值,因此简单地丢弃返回值(将为8)。
答案 3 :(得分:0)
makeIncrementer()
在被分配到increment
var时正在执行。 makeIncrementer()
会返回名为function
的{{1}}。