Ruby on rails ruby真的是一种完全面向对象的语言吗?
Ruby是一种完全面向对象的语言。在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
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包含标签
,表单
等等,它们遵循对象名#方法名
语法,所以我想它们只是普通函数
所以我的问题是
一切都是对象&没有原语。
例如,人们引用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
。我想我错了,谢谢!我将把它升级为一个答案:)可能是的副本,所以这些方法是在模块中定义的,而不是在类中定义的?你的回答成了我一天中最激动人心的时刻。有趣!