上次的作業
如何解決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]。
网友评论