1.如何聲明一個(gè)子類
復(fù)制代碼 代碼如下:
class Treasure Thing
這樣Thing類中的屬性name,description都被Treasure繼承
2.以下三種方式傳入父類initialize方法的參數(shù)分別是什么?
復(fù)制代碼 代碼如下:
# This passes a, b, c to the superclass
def initialize( a, b, c, d, e, f )
super( a, b, c )
end
# This passes a, b, c to the superclass
def initialize( a, b, c )
super
end
# This passes no arguments to the superclass
def initialize( a, b, c)
super()
end
第一種把參數(shù)中a,b,c傳入父類initialize方法;第二種傳入全部參數(shù),但不加上括號;第三種不傳入?yún)?shù)
3.屬性的setter/getter
有人這樣寫setter/getter:
復(fù)制代碼 代碼如下:
puts( t1.get_description )
t1.set_description( “Some description” )
這樣似乎更方便一些:
復(fù)制代碼 代碼如下:
puts( t1.description )
t1.description = “Some description”
如果你想用第二種寫法,你不得不這么寫:
注:這是正確的:def name=(aName)
但這卻是錯的:def name =(aName)
你看出差別的了嗎?
根據(jù)上一章,你可以知道,這里定義了兩個(gè)方法:description方法和description=方法。原來是通過將"="加入方法名實(shí)現(xiàn)的,ruby真是神奇,Java就不能這樣寫。
然而,事實(shí)上有更簡單的方法來實(shí)現(xiàn)setter/getter
復(fù)制代碼 代碼如下:
attr_reader :description
attr_writer :description
由一個(gè)attr_reader/attr_writer加上符號(:description)構(gòu)成,事實(shí)上,可以一次為多個(gè)元素設(shè)置setter/getter
復(fù)制代碼 代碼如下:
attr_writer(:name, :description)
attr_accessor(:value, :id, :owner)
attr_accessor
等價(jià)于:
復(fù)制代碼 代碼如下:
attr_reader :value
attr_writer :value
4.super
和Java不一樣,Ruby中的super方法可以出現(xiàn)在任何方法中,而不只是initialize(構(gòu)造方法)中。
在第2點(diǎn)中就對super方法的使用有介紹,單獨(dú)的super將所有參數(shù)傳給父類initialize,而帶參數(shù)的super則將指定參數(shù)傳給父類initialize。
復(fù)制代碼 代碼如下:
# This passes aName, aDescription to the superclass
def initialize( aName,aDescription )
super( aName, aDescription )
end
# This passes a, b, c to the superclass's aMethod
def aMethod( a, b, c )
super
end
5.常量和嵌套類(constants nested class)
復(fù)制代碼 代碼如下:
class X
A = 10
class Y
def xyz
puts( "goodbye" )
end
end
def self.abc
puts("hello")
end
end
常量:以大寫字母開頭的變量。
如果要訪問常量或內(nèi)部類,需用 ::
復(fù)制代碼 代碼如下:
puts( X::A )
X::abc # 你也可以用::來調(diào)用方法
X.abc # 當(dāng)然這樣也可以
ob = X::Y.new
ob.xyz
6.部分類(Partial Class)
在Ruby中可以對現(xiàn)存的類進(jìn)行修改,并影響已經(jīng)生成的對象
復(fù)制代碼 代碼如下:
class A
def a
puts 'a'
end
end
a = A.new
a.public_methods(false)//打印A class所有public的方法
# => [:a] //只有a
class A
def b
puts 'b'
end
end
a.public_methods(false)
# => [:a, :b]//有a和b
而不能修改的,是類繼承了哪個(gè)類。比如
復(fù)制代碼 代碼如下:
class A
def a
puts 'a'
end
end
class A String
def c
puts 'c'
end
end
# TypeError: superclass mismatch for class A
# 所有類默認(rèn)繼承了Object類,A也繼承了Object,所以當(dāng)你讓A繼承String時(shí)就會報(bào)錯
您可能感興趣的文章:- ruby實(shí)現(xiàn)的文件自刪除代碼分享
- Ruby簡潔學(xué)習(xí)筆記(一):字符串、數(shù)字、類和對象
- 使用Ruby來處理JSON的簡單教程