在Ruby中,如何验证一个Struct的身份?
In Ruby, how does one verify the identity of a Struct?
我一直在努力理解 Ryan Bates 在他的 Presenters RailsCast (#287 Presenters from Scratch (pro) - RailsCasts) 中使用的 present
方法中 self
的 class。在视频中,Ryan 说 'Self is the template object which has all the helper methods we want to access',但我想知道这个对象的 class。在阅读了一系列博客文章、SO 线程和 Ruby 文档之后,我开始认为 self
是一种结构,但我不知道如何证实这个想法。
我的问题是:1)在下面的present
方法中,self
是Struct吗?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
classes 的经验,当我在上面的方法中间坚持 binding.pry
并尝试获取 self
的 class 的名称,我最终有更多问题。
- 当我输入
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
这个 post 有助于解释 Struct 的工作原理,但没有解释如何确认他们拥有一个 Struct。
最初,当我开始剖析 present
方法时,我发现这个 answer 很有用。但是,我被评论抛弃了,说 "ModelPresenter is initialized by passing the model, and the ApplicationHelper class",因为 ApplicationHelper 是一个模块。
总结:
使用is_a?(Struct)
说明:
结构是匿名的构造函数class:
struct_class = Struct.new(:foo)
# => #<Class:0x007fa7e006ea98>
您可以检查匿名 class 的实例是否是这样的结构:
inst = struct_class.new
inst.class.superclass
# => Struct
但是 Object#is_a? 检查父 class 以及 superclasses:
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
我一直在努力理解 Ryan Bates 在他的 Presenters RailsCast (#287 Presenters from Scratch (pro) - RailsCasts) 中使用的 present
方法中 self
的 class。在视频中,Ryan 说 'Self is the template object which has all the helper methods we want to access',但我想知道这个对象的 class。在阅读了一系列博客文章、SO 线程和 Ruby 文档之后,我开始认为 self
是一种结构,但我不知道如何证实这个想法。
我的问题是:1)在下面的present
方法中,self
是Struct吗?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
classes 的经验,当我在上面的方法中间坚持 binding.pry
并尝试获取 self
的 class 的名称,我最终有更多问题。
- 当我输入
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
这个 post 有助于解释 Struct 的工作原理,但没有解释如何确认他们拥有一个 Struct。
最初,当我开始剖析 present
方法时,我发现这个 answer 很有用。但是,我被评论抛弃了,说 "ModelPresenter is initialized by passing the model, and the ApplicationHelper class",因为 ApplicationHelper 是一个模块。
总结:
使用is_a?(Struct)
说明:
结构是匿名的构造函数class:
struct_class = Struct.new(:foo)
# => #<Class:0x007fa7e006ea98>
您可以检查匿名 class 的实例是否是这样的结构:
inst = struct_class.new
inst.class.superclass
# => Struct
但是 Object#is_a? 检查父 class 以及 superclasses:
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