2010-09-24 23 views
7

我的Ruby on Rails框架用戶和正在想捐款給代碼回饋給它。 我知道有必要深入理解Ruby語言概念的貢獻嗎? 我克隆了這個項目,看了看代碼,看看門票,並且不知道如何開始? 從我看到的Rails框架利用元編程很多?那麼爲了開始貢獻,我還需要掌握哪些Ruby的其他方面?還是貢獻一下就是知道Ruby的來龍去脈? 謝謝。我需要知道如何爲Rails做貢獻?

+1

不要聽這些其他人,你可以在不知道Ruby的情況下做很多事情。從文檔和測試開始,隨着您的理解繼續工作 – 2010-09-24 22:46:41

+0

我同意w/@Chuck Vose「開始進行文檔和測試,隨着您的理解繼續前進」。另外 - 選擇您感興趣的框架的一部分,並編寫一個擴展其功能的插件。這應該真的有助於理解該領域的內部。一旦你有了這種理解,看看該地區的門票,看看你能做什麼。祝你好運! – Brian 2010-09-24 23:13:16

回答

4

它已經很長一段時間,因爲我遇到Ruby代碼我不明白跑了,但也有軌道,真正把我的紅寶石理解的部分。

話雖這麼說,即使你是在與多語言的中等水平的,搞清楚如何軌工作可能會是一個偉大的方式來達到你的遊戲。

至於從哪裏開始,我會從編寫插件開始。想想你可以寫的還沒有完成的酷插件,或者你認爲自己可以做得更好的東西。無論你想要做什麼,你都有可能需要掛鉤到某些內部軌道內部去做,這會給你一個開始的好地方。一旦您對該框架的某個特定領域有了一定的瞭解,就可以瞭解該區域是否存在可修復的開放漏洞。

這個障礙是相當高的,因爲rails是一個非常龐大而複雜的程序,由具有非常靈活的語言掌握程度高的人編寫。這也是一個很大的挑戰,最終可能會讓你成爲更好的程序員。 :)

編輯:助陣欄杆

其實,這是非常有趣的,如果它是用來說明類變量和單類是如何工作的一個片段,但也有更清晰的方式,如果它來完成同樣的事情是「真實」的代碼。

Singleton類

在Ruby中,每個對象都有它會從它的方法父類。對於OO語言來說這很正常。什麼是不正常的是Ruby也有一個名爲「對象個性化的概念,這意味着對象可以有僅在一個特定的實例方法,但不能在父類,這裏是一個快速IRB例如

irb(main):001:0> foo = "bar" 
=> "bar" 
irb(main):002:0> def foo.foo_method 
irb(main):003:1> "this is _only_ on the foo instance, not on all strings" 
irb(main):004:1> end 
=> nil 
irb(main):005:0> foo.foo_method 
=> "this is _only_ on the foo instance, not on all strings" 
irb(main):006:0> "bar".foo_method 
NoMethodError: undefined method `foo_method' for "bar":String 
    from (irb):6 
irb(main):007:0> foo = "New string" 
=> "New string" 
irb(main):008:0> foo.foo_method 
NoMethodError: undefined method `foo_method' for "New string":String 
    from (irb):8 

首先,我們給一個變量分配一個字符串,然後我們在那個實例上定義一個方法,調用該方法,但是在一個新的字符串上調用它是行不通的,爲我們的foo變量賦值一個新的字符串實例也沒有那個foo方法

爲了使對象個體化成爲可能,實例和父類之間需要有一些東西,那就是單例類,每個實例都有一個與其他所有對象ct實例。當ruby查找方法時,它會查看父類之前的單例類。

信不信由你,即使你以前從未聽說過這個消息,你可能已經使用過它了。如果你想添加一個「類方法」的東西,你通常會做這個

class Foo 
    def self.bar 
    "i am on the class" 
    end 
end 

Foo.bar #=> "I am on the class" 

從頂部開始,聲明class Foo是這個Foo = Class.new do的完全等效。發生什麼事是你正在給常量Foo分配一個Class類型的新實例。 (順便說一下,這是我喜歡的紅寶石,大多數語法實際上只是一些核心概念上的糖)

在類定義中,self指的是類,所以說def self.bar本質上是說「定義方法欄存儲在常量Foo中的Class實例的單例類中「。

如果你發現這個東西很複雜,那是因爲它。我認爲在ruby中沒有更多的複雜的東西,除此之外,在方法查找過程中會發生什麼,而單例類是使它變得如此複雜的很大一部分。

類變量

甲類變量由@@前綴,並且基本上是一個變量,其範圍的所有實例,類對象,和從類繼承所有類。我會做一個快速的irb來說明這在行動

irb(main):003:0* class Foo 
irb(main):004:1> @@instance_count = 0 
irb(main):005:1> 
irb(main):006:1* def initialize 
irb(main):007:2>  @@instance_count += 1 
irb(main):008:2> end 
irb(main):009:1> 
irb(main):010:1* def count 
irb(main):011:2>  @@instance_count 
irb(main):012:2> end 
irb(main):013:1> end 
=> nil 
irb(main):014:0> 
irb(main):015:0* class Bar < Foo 
irb(main):016:1> end 
=> nil 
irb(main):017:0> 
irb(main):018:0* f = Foo.new 
=> #<Foo:0x7fa9089c7da0> 
irb(main):019:0> f.count 
=> 1 
irb(main):020:0> 
irb(main):021:0* b = Bar.new 
=> #<Bar:0x7fa9089be0e8> 
irb(main):022:0> b.count 
=> 2 
irb(main):023:0> 
irb(main):024:0* f.count 
=> 2 

首先,我們定義Foo。 Foo有一個跟蹤有多少實例被創建的類變量。爲此,我們在構造函數中增加該變量,最後定義一個快速獲取器。酒吧只是延伸Foo。

現在,看看它的行動,我們做一個新的foo,並檢查計數,這是1.接下來,我們創建一個新的酒吧,並檢查計數,我們現在在2。只是爲了確保Foo和Bar都有相同的計數,我們再次檢查我們的foo實例,現在是2。

類變量是一種非常情景化的功能,您通常在框架代碼之外看不到它。當您想要跟蹤給定類的所有實例時,通常會使用它。

欄杆代碼

class << Object.new 
    @@var = 6 
end 


String.class_variable_get(:@@var) #=> 6 

您的代碼顯示在行動這兩個概念。首先,我們打開一個新對象的單例類,並在其上放置一個類變量。如果它不是類變量,那麼前三行將是世界上最無用的ruby代碼。但是由於它是一個類變量,對於類,類的所有實例,從該類繼承的所有類以及從該類繼承的所有類的所有實例而言都是可見的。由於我們所講的課程是對象,這意味着一切。所以在String上做class_variable_get會給你,但你可以從你想要的任何類或實例訪問該變量。

對不起

這是可怕的膚色的東西,是很難解釋清楚。這些概念花了我大約一個星期左右的時間,以相當協調一致的努力把我的頭圍繞起來。如果您對我寫的內容有任何疑問,請隨時詢問,但如果您沒有「明白」,請不要氣餒。

+0

正確的我已經嘗試編寫一些基於Railscasts和Rails Guide的插件,並且仍然試圖在它上面工作......欣賞你的回覆......並且我一定會嘗試按照我的方式工作!謝謝! – Jai 2010-09-25 02:24:55

+0

這裏有一些ruby代碼,我不明白....你給它一個去吧;):'class << Object.new; @@ var = 6;結束; String.class_variable_get(:@@ var)#=> 6' :(:(:(:( – horseyguy 2010-09-25 10:41:29

+0

@banister:寫了一篇相當長的解釋我的帖子:) – 2010-09-25 16:24:36

0

若要在框架工作,你需要有語言有一定的瞭解,或者您知道很多在一個特定的區域,但真正與人接觸,只是說話,他們問什麼有目前的工作,如果你覺得你可以幫助說出來,並給他們你的想法,等等......我的意思是開發社區是非常好的,他們在那裏花時間工作的東西,以免費給其他人的事實,所以總是樂意幫助和嘗試幷包括並讓你知道你是否可以以及如何提供幫助。

但主要是, 更多的則來龍去脈一點,最好的,如果你知道很多在一定區域內

1

想到真的讚賞。我想你自己回答這個問題。如果你不能閱讀和/或理解Rails代碼,那麼這就是瓶頸。甚至沒有看代碼,我會大膽猜測他們使用繼承,混合和元編程。無論您將爲Rails做出貢獻,您都應該嘗試研究這些方面。它們是Ruby,Rails和Ruby/Rails庫中的重要概念。

2

回報率有一堆的,你可以開始了的地方,但他們可能不會是你要尋找什麼。首先開始的可能是文檔here。您需要深入瞭解大量Ruby,才能貢獻出認真的核心修補程序,但您現在可以參與討論,並且可以通過核心團隊真正實際上真正的方式改進文檔需要。

對不起,更好地聯繫起來here

1

我想你回答了很多自己的問題:是的,你需要了解Ruby來促進Ruby項目。

如果你想學習,你可以拿起一票,並開始黑客攻擊的是:有什麼能比得上在深水區跳!不過,我認爲你只能開始,以有效促進項目一旦你用它足以讓自己明白:

  • 哪些功能存在,是有用的,以及它們如何工作
  • 缺少哪些功能和需要幫助
  • 什麼不清楚或混淆的,需要的文檔

上述所有應該來自現實需要:否則你無法說明你爲什麼一些功能,你想出來的需求情況要添加...

0

除了我留在你原來的問題評論...

瑞恩·貝茨(的Railscasts)成名最近發佈的2截屏,他走過了Rails 3路由器的內部。我發現它是一個很好的眼睛開放方法來閱讀和理解框架代碼。如果你有機會,檢查出來:

也許這些「類型轉換可以幫助你在建立你的方式來獲得打倒框架代碼更加舒適。

希望這會有所幫助!