Передача функций в качестве параметров в Squeak - PullRequest
2 голосов
/ 30 ноября 2009

Поскольку Squeak является чисто объектно-ориентированным, я вполне уверен, что вы сможете передавать функции в качестве параметров другим функциям, но когда я занимался этим, я не смог найти никакой информации об этом. Правильна ли моя интуиция? И если так, как это делается и как я могу вызвать их потом?

Ответы [ 2 ]

3 голосов
/ 06 декабря 2009

Более длинный ответ.

Чтобы передать часть исполняемого кода методу, используйте блок.

Определение метода

method: aBlock
    aBlock value 

и вы выполняете его следующим образом

object method: [ Transcript show: 'hello' ].

если вы хотите передать параметр в фрагмент кода, используйте блок с аргументом.

Определение метода

method: aBlock
    aBlock value: 'parameter' 

и вы выполняете это следующим образом

object method: [ :arg | Transcript show: arg ].

то же самое можно сделать с 2 или неограниченными параметрами, используя методы value:value: и valueWithArguments: блока.

Если вы передаете символ, вы также можете использовать value: для его выполнения. Символ фактически эквивалентен блоку вида [ :arg | arg symbol ].

1 голос
/ 30 ноября 2009

Вы путаете две разные вещи. Единственными реальными «функциями», которые вы передаете в Smalltalk, являются блоки, которые вы передаете, просто записывая блок в качестве аргумента (как вы делаете с каждым ifTrue:). Если вы хотите отправить сообщение объекту, но сообщение должно быть определено динамически, вы можете передать имя сообщения в виде символа (например, #value) и отправить его какому-либо объекту (например, с помощью perform:). Вы сами не передаете методы экземпляра. Либо передайте символ селектора, либо передайте блок, который отправляет сообщение для вызова метода.

...