Как связать объект с помощью вызова метода? - PullRequest
2 голосов
/ 23 июня 2011

Допустим, у меня есть

WORLD: make object! [
      people: make Object! []
      cars: make Object! []
      factories: make Object! []
      create: func[][print "new world"]
]

Как мне создать цепочку с помощью метода создания? что-то подобное не работает.

(make WORLD[])/create

Это тот код JavaScript, который я хотел бы эмулировать

(new WORLD()).create()

Ответы [ 2 ]

4 голосов
/ 24 июня 2011

В данном случае это идиома do get in:

>> do get in make object! [a: does [42]] 'a
== 42

IN возвращает слово 'a в контексте объекта.GET возвращает значение, связанное с 'a словом (в этом контексте).Наконец, поскольку мы ожидали, что значение, возвращаемое GET, будет функцией, мы просто вызываем эту функцию, используя DO.

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

do get in make WORLD [] 'create

Согласно предложению Hostile Fork в комментариях, здесь приведена полностью заключенная в скобки версия последнего выражения, чтобы сделать функцию arity явной:

do (get (in (make WORLD []) 'create))
0 голосов
/ 17 июля 2011

Другой подход - немного больше работать с зерном REBOL, этот стиль создания цепочек действительно не в силах REBOL:

WORLD: make object! [
      people: make Object! []
      cars: make Object! []
      factories: make Object! []
      create: does [print "new world"]
]

make WORLD [create]

В качестве альтернативы, если вы ищете ответ от create (который вы не получите в этом случае, поскольку print возвращает unset!):

result: do bind [create] make WORLD []

Возможно, это немного неуклюже по сравнению с цепочкой, но тогда цепочка - это язык старой школы. Использование 'bind похоже на доступ к черной магии.

...