Может ли рубиновый Усы лямбда получить интерполированное значение? - PullRequest
0 голосов
/ 02 марта 2019

В реализации Ruby для Mustache я пытаюсь предоставить некоторые числовые средства форматирования, используя лямбды.Я хотел бы получить интерполированное значение и обработать его.Вот пример, похожий на то, что я пробовал:

context = {
  products: [
    { name: 'Widget', price: 1.2 },
    { name: 'Cog', price: 0.75 }
  ],
  currency: ->(val) { '$' + BigDecimal(val).round(2) }
}

template = <<-EOF
  |Product|Price|
  {{#products}}
  |{{name}}|{{#currency}}{{price}}{{/currency}}|
  {{/products}}
EOF

Mustache.render(template, context)

Я надеюсь, что у нас будет валютная лямбда, которая будет вызываться с ценой продукта.Вместо этого я получаю '{{price}}'.Я пытался использовать Mustache.render(val) в лямбде, но он (кажется) не имеет надлежащего контекста для оценки '{{price}}'

Какие-либо подсказки?

1 Ответ

0 голосов
/ 03 марта 2019

То, что вы действительно хотите сделать, это добавить логику, так что самое простое, что вам нужно сделать, это просто применить ее:

context.each do |product|
  product[:price] = to_currency.call(product[:price])
end

Однако я углубился в это и обнаружил, что вы можетесделать, это создать Mustache класс:

class Product < Mustache
  attr_reader :name
  def initialize(name, price)
    @name, @price = name, price
  end

  def price
    currency(@price)
  end

  private

  def currency(price)
    num_str = BigDecimal(price.to_s).round(2).to_s('F')
    int, flt = num_str.split('.')
    "$#{[int, flt.ljust(2, '0')].join('.')}"
  end
end

template = <<-EOF
  |Product|Price|
  {{#products}}
  |{{name}}|{{price}}|
  {{/products}}
EOF

Mustache.render(template, products: [Product.new('Widget', 1.2), Product.new('Cog', 0.75)])

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

class Foo < Mustache
  def initialize(&block)
    @block = block
  end

  def foo
    @block.call(2)
  end
end

tmp = <<~TMP
  Blah Blah
  blah {{foo}} blah
  Blah
TMP
foo = Foo.new { |x| (x + x).to_s + "asdf" }

foo.render(tmp)
Mustache.render(tmp, foo)

Я никогда не использовал Усы до этого, и я думаю, что разделение между логикойи шаблонизация это здорово!

...