2015-09-16 3 views
3

Допустим, у меня есть:использование Создание полей объекта перечисляются неявных в блоке кода

foo: object [bar: 10] 

print foo/bar ;-- output 10 

Есть некоторые ххх за слова:

foo: object [bar: 10] 

xxx foo [ 
    print bar ;-- output 10 
] 

Binding будет работать, но это некрасиво (ставит ссылку на объект после блока), и вы должны позвонить DO:

foo: object [bar: 10] 

do bind [ 
    print bar ;-- output 10 
] foo 

(Он также мутирует параметр блока по умолчанию ... который, вероятно, не является хорошим общим свойством для искомого xxx.)

ИСПОЛЬЗОВАНИЕ может показаться хорошим словом для xxx, но оно взято для чего-то еще уже: это позволяет объявить слова внутри локального контекста, оставляя прежние определения только этого слова:

foo: object [bar: 10] 

use [foo] [ 
    foo: object [bar: 20] 
    print foo/bar ;-- prints 20 
] 

print foo/bar ;-- prints 10 

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

Один из вариантов заключается в том, чтобы сделать его продолжением использования ... возможно, что он сделал, если вы дали ему GET-WORD! в списке.

ответ

2

Это один из основных сценариев использования для in, то «перевернутой» кузен bind:

>> foo: object [bar: 10] 
== make object! [ 
    bar: 10 
] 

>> do in foo [print bar] 
10 

Если вы не хотите, чтобы блок кода мутировавший, добавьте copy в смесь: do in foo copy [print bar] ,

Обязательно также проверьте (снова) ответ на вопрос «How to use IN with a block instead of an object?».

+0

Правильно ... но вам все еще нужно делать. * (Я на самом деле добавил «вот как вы это сделаете с привязкой после написания остальной части вопроса.) * Удивление, была ли какая-либо конструкция без необходимости. – HostileFork

Смежные вопросы