ruby真的是一个完全面向对象的语言吗?

Cur*_*ind 5 ruby ruby-on-rails ruby-on-rails-3

Ruby是完全面向对象的语言.在红宝石中,一切都是一个对象,因此属于某个类.例如5属于Object class

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 
Run Code Online (Sandbox Code Playgroud)

所以,我们必须通过在类前面添加类/对象名称来调用所有方法Object_name#method_name.例:

5.times{|i| puts i}
Run Code Online (Sandbox Code Playgroud)

现在,Rails有这些所谓的助手一样stylesheet_link_tag,javascript_include_tag,form_for等它不遵循这个Object_name#method_name语法,所以我想他们只是正常功能.

所以我的问题是

  1. 这些铁路助手是什么?
  2. 如果它们只是起作用而且不从任何类继承.与红宝石所说的说法相反,这并不矛盾everything a object & there are no primitives.作为例子,人们引用5.+(6)甚至说运营商只是简单的方法?

Mic*_*ohl 8

对于没有接收器的其他东西,请查看Kernel模块,其中puts定义了类似的东西.由于该模块包含在内Object,其方法随处可见.究竟是什么与IMHO过度使用相矛盾 - 声称一切都是对象?


rog*_*iog 5

这些rails资产标记帮助程序是ActionView的子模块,ActionView::Helpers::AssetTagHelper它提供了生成HTML的方法,可以将视图链接到资源,如图像,javascripts,样式表和feed.

作为modulesclass作为超这意味着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
Run Code Online (Sandbox Code Playgroud)

注意:为简单起见,我将只关注JavascriptIncludeTag,但它们都非常相似.

在这里你会找到一个名为的课程 ActionView::Helpers::AssetTagHelper::JavascriptIncludeTag

你可以实例化

JavascriptIncludeTag.new(config, asset_paths) 
Run Code Online (Sandbox Code Playgroud)

JavascriptIncludeTag类有一个asset_tag调用的content_tag方法,然后调用一个方法并返回正确的标记.

路径:/actionpack/lib/action_view/helpers/asset_tag_helpers/javascript_tag_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
Run Code Online (Sandbox Code Playgroud)

路径:/actionpack/lib/action_view/helpers/tag_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
Run Code Online (Sandbox Code Playgroud)

这样他们的工作方式就更少了.

注意:如果您发现我的解释有点棘手,请告诉我,我会编辑以提供更好的解释