美文网首页Ruby & RailsRuby
05.Ruby學習分享之方法

05.Ruby學習分享之方法

作者: 清水川崎 | 来源:发表于2017-03-26 00:09 被阅读20次

上次的作業

如何解決Hash中String和Symbol作為key的互換問題
如果定義hash的時候key是用symbol定義,那麼使用string作為key就是取不到的。如何使用string和symbol都能取到?
這裡了我們可以為Hash的類擴展一個方法。擴展方法主要和定義類的寫法一樣

class Hash
  def get_value(key)
#我們判斷輸入的key的類類型是否是String,是的話就把它轉化為symbol,不是的話就直接取值
    (key.class == String)?self[key.to_sym]:self[key]
   end
end
    p h.get_value 'a'
    p h.get_value :a
#上面兩種方式都可以取到value

好了,我們來說下今天的內容——方法

方法

方法的定義,我們之前就有提到過。看看下面的例子

方法的定義

實例化對象方法的定義
def foo1
    p 'foo'
    p self
end

比如這裡,我們就定義了一個名為foo1的實例化對象方法,方法體內部主要用來打印一句‘foo’

類方法的定義
def self.foo2
    p 'foo'
    p self
end

比如這裡,我們就定義了一個名為foo2的類方法,方法體內部主要用來打印一句‘foo’

self關鍵字

self關鍵字表示,方法的調用者。那麼foo1方法的self一定是一個實例化對象,而foo2方法的self一定是一個類。

方法的別名

在Ruby中,可以為方法取別名。
給方法取別名可以通過alias關鍵字 前面第一個:為新名字 後面的:為原方法名
取別名的好處在于,不同的情況叫不同的名字。比如判斷一個集合屬不屬於另一個集合可以叫include?,而當判斷一個同學屬不屬於另一個班級,就可以叫做include_member?。這樣代碼復用了,還不需要重複定義。比如下面這個

舉個例子
    alias :b :foo
    foo
    b

我們去調用foo和b,都是去調用了同一個方法體

Ruby中的運算符也是一個方法

例如
arr = [1,2,3]
arr + [4]

這樣的話,其實是給arr這個數組增加了一個新的元素
但是這樣寫還是麻煩 可不可以arr + 4這樣了?原則上不可以,但是我們可以自己定義
我們寫一個單例方法,也就是只屬於某個對象或者某個實例的方法

def arr.+(num)
# dup表示拷貝一次,不改變原來的自己
    self.dup << num
end

現在我們試下可不可以這樣寫?

p arr + 5

Ruby的默認參數

Ruby有參數默認這個機制,比如下面的例子

def war(a,b,c = 3)
    p a + b + c
end
war 1,2

war這個方法了,我們在參數的時候給c了一個初始值3,就是當我們只傳入a、b兩個參數的時候,方法調用依然可以正常運行。比如我們調用了一次,傳入了1,2,那麼結果就是6了。
雖然這個機制不錯,但是我們也就失去了方法重載的機制。不像Java、C++那樣。Ruby這樣做了以後,我們就不能定義方法的時候由於參數的不一樣,被識別為不同方法了。

#c++ / java
foo(a,b)
foo(a,b,c)

像上面這樣 ,ruby會識別為同一個方法

Ruby可以傳入任意多個參數

只需要我們在我們需要的參數的前面加一個號即可,加了的參數,會把多餘參數,自動轉化為數組

def more(a,*b,c)
    p "a=#{a}"
    p "b=#{b}"
    p "c=#{c}"
end

現在我們調用一下

more 1,2,3,4,5,6,7,8

很明顯"a=1","b=[2, 3, 4, 5, 6, 7]","c=8".因為*b把多餘參數轉換為了一個數組

Ruby的括號省略問題

p 'a'其實和p('a')是一樣的,arr.length()和arr.length也是一樣的
當然如果代碼產生了誤會,我們就不能再省略,比如下面的一個求和例子

def sum(a, b = 3)
    a + b
end

如果都省略會為 p sum 1,2.這個時候,解釋器不知道你到底什麼意思。你有可能是這麼想的puts(sum(1),3),也有可能是這麼想的puts(sum(1,3)),所以請加上括號。當然不排除ruby2.4的自動識別功能。
不過,還是不建議這麼做!


今天的作業

對於arr = [1,2,3],寫一個singleton method,將自己變成[2,4,6]。

注意是把自己,如果你發現你調用方法后,原本沒有改變,那就是肯定不行的。而且需要注意,調用方法的前後的對象的內存地址必須要一致!因為這才保證是自己!

相关文章

  • 05.Ruby學習分享之方法

    上次的作業 如何解決Hash中String和Symbol作為key的互換問題如果定義hash的時候key是用sym...

  • 建文九十日

    近居家頗能學習,聽慕課之鋼結構設計原理課程畢,於斯有信心矣。又將學習混凝土之原理。又將學習地基基礎之原理。向日所學...

  • 高效學習

    高效學習 學習要得法,依據所學的內容和不同的學習者來說,最佳的學習方法卻未必確切且唯一,但通常都有規律可循。今閱怎...

  • 學習分享

    期盼已久的內部培訓今天終於等到了,感覺先生好久沒有給我們夥伴做培訓了,自己這段時間也明顯感覺到自己又有些迷...

  • 第五項修煉之團隊學習

    學習是一种語言,也就是說,學習使用這种語言和他人交流,所以,使用語言是學習語言最有效的方法。

  • 簡筆畫新概念導學課四

    回顧一:學習目標和自學方法 1:學習目標:參加演講比賽。 2:自學方法:單詞靠切分,句子用配音。 回顧二:句子結構...

  • 學習學習學習

  • 2018-04-04

    生活·學習·學習生活

  • 身與物化,意到圖成

    前言 經歷了這麼多事,自己最終還是考上,也算是2017年的一個小進步吧。現在我就把我學習的過程中用到的學習方法分享...

  • 我和我媽的日常

    我媽:你幹嘛放假都回學校 我:回去複習啊,不用學習啊 我媽:學學學,整天都只知道學習 我:要考試啊,學習都不給 我...

网友评论

    本文标题:05.Ruby學習分享之方法

    本文链接:https://www.haomeiwen.com/subject/fvdhottx.html