在Ruby中,如何验证Struct的身份?

时间:2018-05-27 23:58:24

标签: ruby-on-rails ruby struct self presenter

我一直试图理解Ryan Bates在他的演示者RailsCast(#287 Presenters from Scratch (pro) - RailsCasts)中使用的self方法中的present类。在视频中,Ryan说,&#39; Self是模板对象,它包含我们想要访问的所有辅助方法,但我想知道这个对象的类。在阅读了一系列博客文章,SO主题和Ruby文档后,我开始认为self是一种结构,但我不知道如何确认这一概念。< / p>

我的问题是: 1)在下面的present方法中,selfStruct?和 2)如何验证某些东西是结构?

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,但我无法&#39 ;找到任何证实此内容的文件
  • 当我输入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
    

post有助于解释结构如何工作,但无法解释如何确认他们是否具有结构。

最初,当我开始剖析present方法时,我发现此answer会有所帮助。然而,我被评论抛弃了,说通过传递模型和ApplicationHelper类&#34;来初始化&#34; ModelPresenter,因为ApplicationHelper是一个模块。

1 个答案:

答案 0 :(得分:1)

<强>摘要

使用is_a?(Struct)

<强>解释

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