В Ruby, как проверить личность Struct? - PullRequest
0 голосов
/ 28 мая 2018

Я пытался разобраться в классе self в методе present, который Райан Бейтс использовал в своих Presenters RailsCast ( # 287 Presenters from Scratch (pro) - RailsCasts ),В видео Райан говорит: «Self - это объект шаблона, который имеет все вспомогательные методы, к которым мы хотим получить доступ», но я хотел знать класс для этого объекта.После прочтения ряда сообщений в блогах, SO-тем и документов по Ruby я начинаю думать, что self - это своего рода структура, но я не знаю, как подтвердить это.

Мойвопросы: 1) В приведенном ниже методе present это self a Struct ?, и 2) Как проверить, что что-то являетсяStruct?

module ApplicationHelper
  def present(object, klass = nil)
    klass ||= "#{object.class}Presenter".constantize
    presenter = klass.new(object, self)
    yield presenter if block_given?
    presenter
  end
end

Я спрашиваю об этом, потому что у меня нет большого опыта работы с Struct классами и когда я втыкаю binding.pry в середину метода выше и пытаюсь получить имякласса для self, я получаю больше вопросов.

  • Когда я ввожу self.class, я получаю #<Class:0x007fb64f696268> Интересно, может ли здесь получить Classчто у меня есть Struct, но я не смог найти никаких документов, подтверждающих это
  • Когда я ввожу self.class.class, я получаю Class
  • КогдаЯ ввожу self, я получаю обширный объект, который начинается со строк кода, перечисленных ниже

    @ line 16 ApplicationHelper#present:
    
    14: def present(object, klass = nil)
    15:   klass ||= "#{object.class}Presenter".constantize
    16:   binding.pry
    17:   presenter = klass.new(object, self)
    18:   yield presenter if block_given?
    19: end
    
    [1] pry(#<#<Class:0x007fb64f696268>>)> self
    => #<#<Class:0x007fb64f696268>:0x007fb64f6948f0
    @_assigns={"marked_for_same_origin_verification"=>true},
    @_config={},
    @_controller=
      #<PostsController:0x007fb64f6762d8
       @_action_has_layout=true,
       @_action_name="show",
       @_config={},
       @_db_runtime=0,
       @_lookup_context=
        #<ActionView::LookupContext:0x007fb64f6760d0
          @cache=true,
          @details=
            {:locale=>[:en],
            :formats=>[:html],
            :variants=>[],
            :handlers=>[:raw, :erb, :html, :builder, :ruby]},
          @details_key=#<Concurrent::Map:0x007fb64f697938 entries=0 default_proc=nil>,
          @prefixes=["posts", "application"],
          @rendered_format=:html,
          @view_paths=
            #<ActionView::PathSet:0x007fb64f675fe0
    

Этот пост помогul, объясняя, как работает Struct, но не объясняет, как можно подтвердить, что они имеют Struct.

Изначально, когда я начал анализировать метод present, я нашел этот ответ быть полезным.Однако я был сбит с толку комментарием, в котором говорилось, что «ModelPresenter инициализируется передачей модели и класса ApplicationHelper», поскольку ApplicationHelper является модулем.

1 Ответ

0 голосов
/ 28 мая 2018

Сводка :

использование is_a?(Struct)

объяснение :

Структура - это конструктор для анонимного класса:

struct_class = Struct.new(:foo)
# => #<Class:0x007fa7e006ea98>

Вы можете проверить, что экземпляр анонимного класса имеет такую ​​структуру:

inst = struct_class.new
inst.class.superclass
# => Struct

Однако Object # is_a? проверяет родительский класс, а также суперклассы:

inst.is_a?(Struct)
# => true

То же поведение вы можете увидеть в следующем произвольном примере:

# inherits from String
anon_class = Class.new(String) 

inst = anon_class.new
# => ""

inst.class == String
# => false

inst.is_a?(String)
# => true
...