10 особенностей CoffeeScript, о которых вы могли не знать

8 мая 2013 г. | | |

Немного вольный перевод статьи "10 CoffeeScript Features You Might Not Know" by Jaco Pretorius.

На этой неделе я потратил некоторое времени на изучение ресурсов о CoffeeScript, которые могли бы быть использованы для обучения клиента, и успел открыть для себя новые возможности CoffeeScript, о которых я раньше не знал или знал, но забыл.

Итерации

Наверно, вам известен стандартный способ перебора элементов списка.

for name in ['Tom','Dick','Harry']
  alert "Hi, #{name}" 


Но знали ли вы, что можно получить индекс текущего элемента, добавив экстра-аргумент? 

for name, i in ['Tom','Dick','Harry']
  alert "Hi, #{name} - you are number #{i}"

Групповые аргументы (splatting)

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

planets = (first, second, third) ->
  alert third

planets 'Mercury', 'Venus', 'Earth', 'Mars', 'Jupiter'
# alert will be 'Earth'


Но знали ли вы, что CoffeeScript поддерживает групповые аргументы? (Групповые аргументы обозначаются добавление троеточия - прим. переводчика)

planets = (first, second, others...) ->
  alert others

planets 'Mercury', 'Venus', 'Earth', 'Mars', 'Jupiter'
# alert will be 'Earth','Mars','Jupiter'

Генераторы (сomprehensions)

Coffeescript также поддерживает генераторы - похоже на map в Ruby.

class Person
  constructor: (name, email) ->
    @name = name
    @email = email

userEmails =
  tom: 'tom@example.com'
  dick: 'dick@example.com'
  harry: 'harry@example.com'

contacts = for name, email of userEmails
  new Person(name,email)

Реструктурирующее присваивание

Деструктивное присваивание - ещё один способ реализации множественного присваивания. Вы можете использовать это для переключения значений между двумя переменными одной операцией:

one = 1
two = 2
[one, two] = [two, one]

Этот приём можно так же использовать для присваивания результата функции нескольким переменным:

date = ->
  [25,'April',2013]

[day, month, year] = date()

И даже так - работает:

person =
  name: 'John'
  email: 'john@example.com'
  address:
    street: [
      '123 Main Street'
      'Apt 8B'
    ]
    city: 'Gotham'
    zip: '8442'

{ address: { street: [_, apartment], city } } = person

Реструктурирующее присваивание + генераторы

Реструктурирующее присваивание так же работает в паре с генераторами, что даёт мощный инструмент при работе с массивами переменной длины.

daysOfTheWeek = "Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday"
[first, rest..., last] = daysOfTheWeek.split ','

# прим. переводчика:
# first = "Monday"
# rest = ["Tuesday","Wednesday","Thursday","Friday","Saturday"]
# last = "Sunday"

Цепочки сравнений

Coffeescript так же поддерживает цепочки сравнений (позаимствовано из Python), что позволяет легко проверить, находится ли значение в заданном диапазоне:

temperature = 72
niceDay = 82 > temperature > 68

Встроенные документы (Block strings)

Вы, наверное, знаете, что Coffeescript поддерживает интерполяцию строк (синтаксис такой же, как в Ruby).

name = "John"
surname = "Doe"
greeting = "Hi, #{name} #{surname}"


Но знали ли вы, что CoffeeScript поддерживает встроенные документы? Это очень полезная штука для текста, где важны пробелы и отступы, т.к. формат текста внутри встроенного документа сохраняется:

html = """
        <p>
    Hi, #{name} #{surname}
    </p>
    """

Псевдоним @

Вы, наверное, знаете, что @ - это псевдоним для this. Но знали ли вы, что в CoffeeScript есть подобный псевдоним и для доступа к прототипу класса?

String::pipeDelimited = ->
  @split '|'

alert "ABC|abc".pipeDelimited()

Привязка параметров к свойствам

CoffeeScript  позволяет нам делать привязку параметров к свойствам с помощью @. Например, часто нужно установить свойство в конструкторе:

class Person
  constructor:(name) ->
    @name = name

Вместо этого можно использовать привязку через @. Coffeescript - единственный язык известных мне языков, который позволяет так делать.  

class Person
  constructor:(@name) ->

Методы класса / статические методы 

Псевдоним @ позволяет определять статические методы класса.

class Number
  @random: ->     return 4 # chosen by fair dice roll
              # guaranteed to be random

alert Number.random()

Алгоритм генерации случайных чисел взят с XKCD.

1 коммент.:

Kupstas комментирует...

А разве это не известные вещи?) Они достаточно хорошо описаны на главной странице coffeescript

Отправить комментарий