我一直在尝试理解Ryan Bates在他的Presenters (#287 Presenters from Scratch (pro) - RailsCasts)中使用的present
方法中的self
类。在视频中,Ryan说,'Self是一个模板对象,它包含了我们想要访问的所有助手方法‘,但我想知道这个对象的类。在阅读了一系列博客文章、线程和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
类的经验,当我将binding.pry
放在上面的方法中间并试图获得self
的类名时,我最终会遇到更多的问题。
self.class
时,我得到,#<Class:0x007fb64f696268>
我想知道在这里获取Class
是否表示我有一个Struct
__,但是我找不到任何确认此self.class.class
时,我得到< code >D24 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: self if block_given? 19: end 1 pry(#<#>)> self => #<#:0x007fb64f6948f0 presenter @_config={},@_controller= #:en,:formats=>:html,:variants=>[],:handlers=>:raw,:erb,:html,:builder,:ruby},show entries=0 default_proc=nil>,应用程序“#”,“@prefixes=”,@rendered_format=:html,@view_paths= posts
这个post有助于解释结构是如何工作的,但不能解释如何确认他们有一个结构。
最初,当我开始剖析present
方法时,我发现这个answer很有帮助。然而,我被这条评论搞糊涂了,他说"ModelPresenter是通过传递模型和ApplicationHelper类来初始化的“,因为ApplicationHelper是一个模块。
发布于 2018-05-28 08:57:39
摘要
使用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
https://stackoverflow.com/questions/50557579
复制相似问题