Выбор пользовательских жидкостных блоков переменных контекста

В дополнение к большим ответам до сих пор я хотел бы представить совершенно другую причину, по которой функции стрелок в определенном смысле существенно лучше, чем «обычные» функции JavaScript. Для обсуждения, давайте временно предположим, что мы используем проверку типа TypeScript или «Flow» Facebook. Рассмотрим следующий игрушечный модуль, который является действительным кодом ECMAScript 6 плюс плюс аннотации типа потока: (я буду включать нетипный код, который в конечном итоге будет получен из Babel в конце этого ответа, поэтому он может быть запущен.)

export class C {
  n : number;
  f1: number => number; 
  f2: number => number;

  constructor(){
    this.n = 42;
    this.f1 = (x:number) => x + this.n;
    this.f2 = function (x:number) { return  x + this.n;};
  }
}

Теперь посмотрим, что произойдет, когда мы используем класс C из другого модуля, например:

let o = { f1: new C().f1, f2: new C().f2, n: "foo" };
let n1: number = o.f1(1); // n1 = 43
console.log(n1 === 43); // true
let n2: number = o.f2(1); // n2 = "1foo"
console.log(n2 === "1foo"); // true, not a string!

Как вы можете видеть, ошибка проверки типа здесь: f2 должен был возвратить число, но он вернул строку!

Хуже того, кажется, что нет мыслимой проверки типа может обрабатывать обычные (не стрелочные) функции JavaScript, потому что «это» из f2 не встречается в списке аргументов f2, поэтому требуется type для «this» не может быть добавлен как аннотация к f2.

Эта проблема также затрагивает людей, которые не используют контролеры типов? Я так думаю, потому что даже когда у нас нет статических типов, мы думаем, что они там. («Первые параметры должны быть числом, второе - строкой» и т. Д.). Скрытое «это» действие, которое может или не может быть использовано в теле функции, делает нашу умственную бухгалтерию более сложной.

Вот текущая нетипизированная версия, которая будет вызываться Babel:

class C {
    constructor() {
        this.n = 42;
        this.f1 = x => x + this.n;
        this.f2 = function (x) { return x + this.n; };
    }
}

let o = { f1: new C().f1, f2: new C().f2, n: "foo" };
let n1 = o.f1(1); // n1 = 43
console.log(n1 === 43); // true
let n2 = o.f2(1); // n2 = "1foo"
console.log(n2 === "1foo"); // true, not a string!

1
задан Mike Lui 13 July 2018 в 19:26
поделиться

2 ответа

Попробуйте изменить {% assign variable = site.variables | where "someval", "true" %} на {% assign variable = site.variables | where: "someval", "true" %}.

Кроме того, это не похоже, что variable является опцией в соответствии с docs . Если вы хотите передать больше информации, вам нужно использовать что-то вроде site.data или информации, определенной в вашем инициализаторе jekyll (обычно называемом _config.yml).

0
ответ дан Joseph Cho 17 August 2018 в 12:15
поделиться
  • 1
    Мой MCVE был написан в спешке. См. Редактирование. Я попробовал это с моим фактическим кодом и получил те же неожиданные результаты, которые не имеют значения. – Mike Lui 13 July 2018 в 19:04
  • 2
    Я буду отмечать это правильно, потому что я думаю, что это просто неподдерживаемое использование. Я считаю, что jekyll / liquid предпочтет пользователя использовать существующие жидкие блоки и получить доступ к данным jekyll из жидких шаблонов, вместо передачи данных jekyll непосредственно в систему плагина. Это несчастливо, потому что для этого требуется больше копий & amp; вставить. – Mike Lui 13 July 2018 в 19:29

Было несколько красных сельдей, которые оказались проблемой:

  • my variable на самом деле является Drop и не является нормальным хеш-значением. В частности, это DocumentDrop , который делегирует to_s классу Document .
  • Реализация to_s выводит либо Document 's output, content, либо "NO CONTENT".
  • В моем случае output и content были либо символом пробела, либо символом новой строки, так что это все, что было выведено. Это связано с тем, что файлы существуют только для их передней части, поэтому фактического содержимого нет.
  • Доступ к фронту осуществляется через интерфейс Drop. Таким образом, я действительно получал variable, было просто пустое строковое представление.
  • Без дальнейших церемоний для доступа к данным о фронте: context[@variable]["my-front-matter-data"]

Ну, по крайней мере, я чувствую себя менее рубиновым новичком.

1
ответ дан Mike Lui 17 August 2018 в 12:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: