пространства имен в coffeescript - PullRequest
4 голосов
/ 15 июня 2011

Я бы хотел использовать пространства имен, как в javascript, используя ключевое слово «with», но CoffeeScript сообщает об этом как зарезервированное ключевое слово и отказывается компилировать. Есть ли способ использовать пространства имен в cs?

В частности, я хочу включить файл CoffeeScript динамически (надежный источник), например, загрузку моделей для схемы базы данных, но я хочу, чтобы включенный скрипт имел доступ к локальному пространству имен.


Редактировать:

Вот что я хочу сделать.Я настраиваю веб-фреймворк, который отображает дерево каталогов в приложение на основе Express и Mongoose.Например, есть подкаталог «models», в котором содержится файл «user.coffee» с кодом, подобным следующему:

name:
    type: String
    unique: on
profiles: [ Profile ]

, где Profile - это класс, который находится в локальном объекте с именем model.Когда пользовательская модель загружается, я хотел получить доступ к классам моделей, которые находятся в моем локальном хранилище моделей.

Мой обходной путь - написать model.Profile в файл 'user.coffee'.Надеюсь, понятно, о чем я.


2nd Edit

Вот как я это сделал без использования with:

пользователя.кофе

name:
    type: String
    unique: on
profiles: [ @profile ]

profile.coffee

content: String

А вот как он динамически загружается:

for fm in fs.readdirSync "#{base}/models"
    m = path.basename fm, '.coffee'
    schema[m] = (()->
        new Schema coffee.eval (
            fs.readFileSync "#{base}/models/#{fm}", 'utf8'
        ), bare: on
    ).call model
    mongoose.model m, schema[m]
    model[m] = mongoose.model m

Мне кажется, это хорошее решение.

Ответы [ 4 ]

6 голосов
/ 15 июня 2011

Вам навязывают чужое мнение?Hack Time ™!

o =
  a: 1
  b: 2
  c: 3

`with(o) {//`
  alert a
`}`

"Компилируется" в:

var o;
o = {
  a: 1,
  b: 2,
  c: 3
};
with(o) {//;
alert(a);
};

Жаль, что это еще одна область, где мнение Дуга Крокфорда воспринимается как евангелие.with Заявление считается опасным отклоняет его на основании неоднозначности записи свойства, но игнорирует его полезность при использовании с контекстным объектом только для чтения , таким как контекстный объект, который определяетDSL-подобный API.

5 голосов
/ 15 июня 2011

Вилка Coco CoffeeScript поддерживает синтаксис with; см. https://github.com/satyr/coco/wiki/additions. Однако этот синтаксис просто устанавливает значение this для целевого объекта в блоке, а не компилирует проблемное и устаревшее ключевое слово with.

Допустим, вы хотели эмулировать синтаксис Коко with в CoffeeScript. Вы бы сделали что-то вроде этого:

withObj = (obj, func) -> func.call obj

Тогда вы могли бы написать

withObj = (obj, func) -> func.call obj
withObj annoyingly.lengthy.obj.reference, ->
  @foo = 'bar'
  @bar = 'baz'

Конечно, в таких простых случаях лучше использовать служебную функцию, такую ​​как jQuery или Underscore extend:

_.extend annoyingly.lengthy.obj.reference, foo: 'bar', bar: 'baz'
3 голосов
/ 15 июня 2011

Нет.Однако вы можете использовать деструктурирующее назначение для достижения аналогичного эффекта.

{foo, bar, baz} = require 'toocoollib'
foo 'whoa!'

Вы также должны знать, что ключевое слово with устарело и является синтаксической ошибкой в строгом режиме ES5.Консенсус среди основных хакеров JS заключается в том, что with - плохая идея.

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

2 голосов
/ 15 июня 2011

Только что обнаружил, что на странице часто задаваемых вопросов CoffeeScript о "Импорте переменных":

https://github.com/jashkenas/coffee-script/wiki/FAQ

Кажется, использование этой техники не рекомендуется в CoffeeScript и не поддерживается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...