Почему JSON :: Builder не использует модификатор with obj yield?

Crystal позволяет использовать ключевое слово with для улучшения DSL.

Но в своей стандартной библиотеке он не используется для JSON :: Builder, пример из документации выглядит так:

JSON.build do |json|
  json.object do
    json.field "name", "foo"
  end
end

Хотя это можно было бы записать короче:

JSON.build do
  object do
    field "name", "foo"
  end
end

Итак, почему это не реализовано таким образом? Есть ли недостатки в использовании with xxx yield?

Возможная реализация

class JSON
  def self.build
    with JSON.new yield
  end

  def object
    builder = JSONObject.new
    with builder yield self
    p builder.result
  end

  class JSONObject
    getter :result
    @result = Hash(String, String).new
    def field(key : String, value : String)
      @result[key] = value
    end
  end
end

person Alex Craft    schedule 28.12.2019    source источник


Ответы (1)


Потому что во многих случаях вы хотите передать построитель другому методу, и нет возможности сослаться на self внутри with ... yield.

Вдобавок JSON::Builder используется не так часто, поэтому нет большой разницы в том, чтобы время от времени писать еще несколько символов.

person asterite    schedule 29.12.2019
comment
Чтобы поддержать распространяющуюся причину: JSON.build вряд ли образует специфический для предметной области язык. Это просто обычный API, который можно интегрировать с другими API и пользовательскими реализациями. - person Johannes Müller; 30.12.2019