Ruby簡(jiǎn)潔學(xué)習(xí)筆記(二):類(lèi)繼承、屬性、類(lèi)變量
1.如何聲明一個(gè)子類(lèi)
class Treasure < Thing
這樣Thing類(lèi)中的屬性name,description都被Treasure繼承
2.以下三種方式傳入父類(lèi)initialize方法的參數(shù)分別是什么?
# 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傳入父類(lèi)initialize方法;第二種傳入全部參數(shù),但不加上括號(hào);第三種不傳入?yún)?shù)
3.屬性的setter/getter
有人這樣寫(xiě)setter/getter:
puts( t1.get_description )
t1.set_description( “Some description” )
這樣似乎更方便一些:
puts( t1.description )
t1.description = “Some description”
如果你想用第二種寫(xiě)法,你不得不這么寫(xiě):
注:這是正確的:def name=(aName)
但這卻是錯(cuò)的:def name =(aName)
你看出差別的了嗎?
根據(jù)上一章,你可以知道,這里定義了兩個(gè)方法:description方法和description=方法。原來(lái)是通過(guò)將"="加入方法名實(shí)現(xiàn)的,ruby真是神奇,Java就不能這樣寫(xiě)。
然而,事實(shí)上有更簡(jiǎn)單的方法來(lái)實(shí)現(xiàn)setter/getter
attr_reader :description
attr_writer :description
由一個(gè)attr_reader/attr_writer加上符號(hào)(:description)構(gòu)成,事實(shí)上,可以一次為多個(gè)元素設(shè)置setter/getter
attr_writer(:name, :description)
attr_accessor(:value, :id, :owner)
attr_accessor
等價(jià)于:
attr_reader :value
attr_writer :value
4.super
和Java不一樣,Ruby中的super方法可以出現(xiàn)在任何方法中,而不只是initialize(構(gòu)造方法)中。
在第2點(diǎn)中就對(duì)super方法的使用有介紹,單獨(dú)的super將所有參數(shù)傳給父類(lèi)initialize,而帶參數(shù)的super則將指定參數(shù)傳給父類(lèi)initialize。
# 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.常量和嵌套類(lèi)(constants & nested class)
class X
A = 10
class Y
def xyz
puts( "goodbye" )
end
end
def self.abc
puts("hello")
end
end
常量:以大寫(xiě)字母開(kāi)頭的變量。
如果要訪問(wèn)常量或內(nèi)部類(lèi),需用 ::
puts( X::A )
X::abc # 你也可以用::來(lái)調(diào)用方法
X.abc # 當(dāng)然這樣也可以
ob = X::Y.new
ob.xyz
6.部分類(lèi)(Partial Class)
在Ruby中可以對(duì)現(xiàn)存的類(lèi)進(jìn)行修改,并影響已經(jīng)生成的對(duì)象
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
而不能修改的,是類(lèi)繼承了哪個(gè)類(lèi)。比如
class A
def a
puts 'a'
end
end
class A < String
def c
puts 'c'
end
end
# TypeError: superclass mismatch for class A
# 所有類(lèi)默認(rèn)繼承了Object類(lèi),A也繼承了Object,所以當(dāng)你讓A繼承String時(shí)就會(huì)報(bào)錯(cuò)
相關(guān)文章
在Ruby on Rails上使用Redis Store的方法
這篇文章主要介紹了在Ruby on Rails上使用Redis Store的方法,是Ruby程序和Redis數(shù)據(jù)庫(kù)結(jié)合的有效途徑,需要的朋友可以參考下2015-06-06Ruby中的Range對(duì)象學(xué)習(xí)筆記
這篇文章主要介紹了Ruby中的Range對(duì)象學(xué)習(xí)筆記,本文講解了Range對(duì)象的定義、Range對(duì)象的一些使用技巧等內(nèi)容,需要的朋友可以參考下2014-11-11Ruby中使用連續(xù)體Continuation實(shí)現(xiàn)生成器
這篇文章主要介紹了Ruby中使用連續(xù)體Continuation實(shí)現(xiàn)生成器,本文先是介紹了生成器的概念,然后給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-01-01實(shí)例解析Ruby中的數(shù)值類(lèi)型以及常量
這篇文章主要介紹了Ruby中的數(shù)值類(lèi)型以及常量,是Ruby入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-10-10利用RJB在Ruby on Rails中使用Java代碼的教程
這篇文章主要介紹了利用RJB在Ruby on Rails中使用Java代碼的教程,本文來(lái)自于IBM官方網(wǎng)站技術(shù)文檔,需要的朋友可以參考下2015-04-04簡(jiǎn)單對(duì)比分析Ruby on Rails 和 Laravel
web應(yīng)用程序開(kāi)發(fā)中兩個(gè)相對(duì)而言更加流行的框架是 Ruby on Rails 和 Laravel. 它們兩個(gè)都是非常成熟的項(xiàng)目,已經(jīng)面世相當(dāng)長(zhǎng)一段時(shí)間了 .2014-07-07Ruby中的public、private、protected區(qū)別小結(jié)
這篇文章主要介紹了Ruby中的public、private、protected區(qū)別小結(jié),即Ruby中訪問(wèn)控制符的區(qū)別總結(jié),需要的朋友可以參考下2014-08-08