首先,如果你還沒有完全理解,給變量的賦值是通過=
完成,你可以通過在任何東西上附加.class
來檢查它是什麼類型的變量。
考慮以下幾點:
name = 'John'
puts name
# => John
puts name.class
# => String
如今,其次,應該指出的是,所有方法的返回值都是不同的。但是,所有的人都可以被識別爲兩種類型:
中的方法:
- 迴歸自我
不是自我其他
- 任何回報
示例1
- 返回self的方法,您可以說返回相同類型的對象的方法,在我們的具體情況下,這是String
name = 'John'
puts name
# => 'John'
puts name.class
# => String
downcased_name = name.downcase
puts downcased_name
# => john
puts downcased_name.class
# => String
deleted_downcased_name = downcased_name.delete('h')
puts deleted_downcased_name
# => jon
puts deleted_downcased_name.class
# => String
# All of the above can be just simplified into:
deleted_downcased_name2 = 'John'.downcase.delete('h')
puts deleted_downcased_name2
# => jon
puts deleted_downcased_name2.class
# => String
注意deleted_downcased_name
和deleted_downcased_name2
都是一樣的,因爲你可以,如果你要串聯的返回值是「約翰」治療方法鏈接 - >「約翰」 - >「喬恩」。
例2種
- 方法,返回什麼,但自我,你可以說,返回不同類型的方法。
在我們的具體情況下,字符串的downcase!
情況傳回String
或NilClass
(reference here)
- 返回
String
如果字符串的變化,或
- 返回
nil
如果字符串已downcased與(沒有變化)開始。
或其他字符串的方法: (reference here)
這方法行不通,其中鏈(引發錯誤),當您嘗試使用字符串方法作爲一個鏈向零值。
考慮以下
name = 'mary'
puts name
# => 'mary'
puts name.class
# => String
downcased_name = name.downcase!
puts downcased_name
# => nil
puts downcased_name.class
# => NilClass
downcased_name.delete('h')
# => This will raise the following error
# NoMethodError: undefined method `delete' for nil:NilClass
上述錯誤是因爲downcased_name是你期待它是一個類型的String
類型的NilClass
。因此你不能鏈接任何字符串方法了。您只能在String
類型的值上鍊接String
方法。同樣,您只能在Number
類型的值上鍊接Number
方法。
每當有疑問時,您總是可以檢查文檔以檢查方法的作用,以及它的返回值和類型。
只是使用'downcase'而不是'downcase!'? – YOU