2012-05-18 74 views
5

Ruby是完全面向對象語言。在紅寶石中,所有東西都是對象&因此屬於某個類。例如5屬於Object classruby​​真的是一個完全面向對象的語言嗎?

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_name#method_name調用的所有方法。例如:

5.times{|i| puts i} 

現在,Rails有這些所謂的助手像stylesheet_link_tagjavascript_include_tagform_for等,這也遵循這一Object_name#method_name語法,所以我想他們只是正常功能。

所以我的問題是

  1. 這些是什麼軌幫手?
  2. 如果他們只是功能&不要 繼承自任何類。這是否與 所說的 - 紅寶石,everything a object & there are no primitives相矛盾。作爲例子,人們舉例說5.+(6)甚至說運營商只是 明確的方法?
+1

當你看到方法調用沒有明確的接收器,然後接收器'self'。你究竟如何得出結論:「一切都是對象」是不正確的? –

+0

Ohk,我不知道「自我」。我想我錯了,謝謝! – CuriousMind

+1

我會將其升級爲答案:) –

回答

8

對於其他的東西叫做無接收器,看Kernel模塊,其中這樣的東西puts定義。由於該模塊包含在Object中,因此它的方法隨處可用。如何反對 - 恕我直言過度使用 - 聲稱一切都是對象?

+0

所以這些方法是在模塊中定義的,而不是類?你的答案已經成爲我一天中的一刻。有趣! – CuriousMind

4

當您看到方法調用沒有明確的接收方時,那麼接收方是self。對象可以通過許多不同的方式獲取方法。其中最明顯的一點是你自己定義方法的時候。然後你也可以包含模塊。

class Person 
    # this adds a bunch of methods to Person, making it a Mongoid model 
    include Mongoid::Document 
end 

您包含的模塊和您繼承的類可以以相同的方式獲取功能。

因此,當您看到沒有接收器的方法時,請考慮「現在什麼是self?它的類是什麼?它定義了哪些方法?它包含哪些模塊?你會發現關於ruby和rails的很多有趣的事情。 :)

5

這些rails資產標記幫助程序是ActionView的子模塊,ActionView::Helpers::AssetTagHelper提供了用於生成將視圖鏈接到資源(如圖像,JavaScript,樣式表和Feed)的HTML的方法。

由於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 

注:爲簡單起見,我將只專注於JavascriptIncludeTag的緣故,但他們都非常相似。

在這裏你會發現一個名爲ActionView::Helpers::AssetTagHelper::JavascriptIncludeTag

類,你可以實例化

JavascriptIncludeTag.new(config, asset_paths) 

的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 

路徑:/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 

使更不用說他們的工作方式。

注意:如果你發現我的解釋有點棘手,只是讓我知道,我會編輯,以提供更好的解釋

相關問題