Ruby on rails ruby真的是一种完全面向对象的语言吗?

Ruby on rails ruby真的是一种完全面向对象的语言吗?,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,Ruby是一种完全面向对象的语言。在ruby中,一切都是对象&因此,都属于某个类。例如5属于对象类 1.9.3p194 :001 > 5.class => Fixnum 1.9.3p194 :002 > 5.class.superclass => Integer 1.9.3p194 :003 > 5.class.superclass.superclass => Numeric 1.9.3p194 :005 > 5.class.supercla

Ruby是一种完全面向对象的语言。在ruby中,一切都是对象&因此,都属于某个类。例如
5
属于
对象类

1.9.3p194 :001 > 5.class
 => Fixnum 
1.9.3p194 :002 > 5.class.superclass
 => Integer 
1.9.3p194 :003 > 5.class.superclass.superclass
 => Numeric 
1.9.3p194 :005 > 5.class.superclass.superclass.superclass
 => Object 
1.9.3p194 :006 > 5.class.superclass.superclass.superclass.superclass
 => BasicObject 
1.9.3p194 :007 > 5.class.superclass.superclass.superclass.superclass.superclass
 => nil 
因此,我们必须通过在
object\u name#method\u name
中前缀class/object name来调用所有方法。例如:

5.times{|i| puts i}
现在,rails有一些所谓的助手,比如
样式表链接标签
javascript包含标签
表单
等等,它们遵循
对象名#方法名
语法,所以我想它们只是普通函数

所以我的问题是

  • 这些rails助手是什么
  • 如果它们只起作用&不起作用 从任何类继承。这与所提出的主张不矛盾吗 在ruby中,
    一切都是对象&没有原语。
    例如,人们引用
    5.+(6)
    说,即使是运算符也只是 简单的方法

    对于在没有接收器的情况下调用的其他东西,请查看
    内核
    模块,其中定义了
    put
    之类的内容。由于模块包含在
    对象中
    ,因此其方法在任何地方都可用。这与“一切都是对象”的说法有什么矛盾呢?

    当你看到没有显式接收器的方法调用时,接收器是
    self
    。对象可以通过许多不同的方式获取方法。最明显的一点是,当您自己定义方法时。然后还可以包括模块

    class Person
      # this adds a bunch of methods to Person, making it a Mongoid model
      include Mongoid::Document
    end
    
    包含的模块和继承的类可以以相同的方式获取功能


    所以,当您看到没有接收器的方法时,请思考“此时什么是
    self
    ?它的类是什么?它定义了什么方法?它包含哪些模块?”您将发现关于ruby和rails的许多有趣的事情

    这些rails资产标记帮助程序是ActionView的一个子模块,
    ActionView::helpers::AssetTagHelper
    提供了生成HTML的方法,该HTML将视图链接到图像、Java脚本、样式表和提要等资产

    由于
    模块
    作为一个超类,这意味着AssetTagHelpers也将拥有它

    irb(main):016:0> ActionView::Helpers::AssetTagHelper
    => ActionView::Helpers::AssetTagHelper
    irb(main):017:0> ActionView::Helpers::AssetTagHelper.class
    => Module
    irb(main):018:0> ActionView::Helpers::AssetTagHelper.class.superclass
    => Object
    irb(main):019:0> ActionView::Helpers::AssetTagHelper.class.superclass.superclass
    => BasicObject
    irb(main):020:0> ActionView::Helpers::AssetTagHelper.class.superclass.superclass.superclass
    => nil
    
    注意:为了简单起见,我将只关注JavascriptIncludeTag,但它们都非常相似

    在这里,您将找到一个名为
    ActionView::Helpers::AssetTagHelper::JavascriptIncludeTag

    您可以将其实例化

    JavascriptIncludeTag.new(config, asset_paths) 
    
    JavascriptIncludeTag类有一个名为
    asset\u tag
    的方法,然后调用
    content\u tag
    方法并返回正确的标记

    路径:/actionpack/lib/action\u view/helpers/asset\u tag\u helpers/javascript\u tag\u helpers.rb

    require 'action_view/helpers/asset_tag_helpers/asset_include_tag'
    
    # NOTE: on the 'action_view/helpers/asset_tag_helpers/asset_include_tag' it requires '/actionpack/lib/action_view/helpers/tag_helper.rb' so now all this files are connected :)
    .
    .
    .
    def asset_tag(source, options)
      content_tag("script", "", { "src" => path_to_asset(source) }.merge(options))
    end
    
    路径:/actionpack/lib/action\u view/helpers/tag\u helper.rb

    def content_tag(name, content_or_options_with_block = nil, options = nil, escape = true, &block)
      if block_given?
        options = content_or_options_with_block if content_or_options_with_block.is_a?(Hash)
        content_tag_string(name, capture(&block), options, escape)
      else
        content_tag_string(name, content_or_options_with_block, options, escape)
      end
    end
    
    因此,它们的工作方式就更少了


    注意:如果您发现我的解释有点棘手,请告诉我,当您看到没有显式接收器的方法调用时,我将进行编辑以提供更好的解释

    ,那么接收器是
    self
    。你到底是如何得出“一切都是一个物体”这一结论的?哦,我不知道关于
    self
    。我想我错了,谢谢!我将把它升级为一个答案:)可能是的副本,所以这些方法是在模块中定义的,而不是在类中定义的?你的回答成了我一天中最激动人心的时刻。有趣!