Ruby學習-第二章

來源:互聯網
上載者:User

標籤:

第二章

類繼承,屬性,類變數

1.如何聲明一個子類

class Treasure < Thing

這樣Thing類中的屬性name,description都被Treasure繼承

 

2.以下三種方式傳入父類initialize方法的參數分別是什嗎?

# This passes a, b, c to the superclassdef initialize( a, b, c, d, e, f )  super( a, b, c )end# This passes a, b, c to the superclassdef initialize( a, b, c )  superend# This passes no arguments to the superclassdef initialize( a, b, c)  super()end

 

第一種把參數中a,b,c傳入父類initialize方法;第二種傳入全部參數,但不加上括弧;第三種不傳入參數

 

3.屬性的setter/getter

有人這樣寫setter/getter:

puts( t1.get_description ) 
t1.set_description( “Some description” )

這樣似乎更方便一些:

puts( t1.description ) t1.description = “Some description”

如果你想用第二種寫法,你不得不這麼寫:

def description     return @description end def description=( aDescription )     @description = aDescription end

註:這是正確的:def name=(aName)

  但這卻是錯的:def name  =(aName)

你看出差別的了嗎?

 

根據上一章,你可以知道,這裡定義了兩個方法:description方法和description=方法。原來是通過將"="加入方法名實現的,ruby真是神奇,Java就不能這樣寫。

 

然而,事實上有更簡單的方法來實現setter/getter

attr_reader :description attr_writer :description

由一個attr_reader/attr_writer加上符號(:description)構成,事實上,可以一次為多個元素設定setter/getter

attr_writer(:name, :description) 
attr_accessor(:value, :id, :owner)

attr_accessor

等價於:

attr_reader :value

attr_writer :value

 

4.super

和Java不一樣,Ruby中的super方法可以出現在任何方法中,而不只是initialize(構造方法)中。

在第2點中就對super方法的使用有介紹,單獨的super將所有參數傳給父類initialize,而帶參數的super則將指定參數傳給父類initialize。

# This passes aName, aDescription to the superclassdef initialize( aName,aDescription )  super( aName, aDescription )end# This passes a, b, c to the superclass‘s aMethoddef aMethod( a, b, c )  superend

 

5.常量和嵌套類(constants & nested class)

class X A = 10  class Y  def xyz   puts( "goodbye" )  end end  def self.abc  puts("hello") endend

 

常量:以大寫字母開頭的變數。

如果要訪問常量或內部類,需用 ::

puts( X::A )X::abc        # 你也可以用::來調用方法X.abc        # 當然這樣也可以ob = X::Y.newob.xyz

 

6.部分類(Partial Class)

在Ruby中可以對現存的類進行修改,並影響已經產生的對象

class A  def a    puts ‘a‘  endenda = A.newa.public_methods(false)//列印A class所有public的方法# => [:a] //只有aclass A  def b    puts ‘b‘  endenda.public_methods(false)# => [:a, :b]//有a和b

而不能修改的,是類繼承了哪個類。比如

class A  def a    puts ‘a‘  endendclass A < String  def c    puts ‘c‘  endend
# TypeError: superclass mismatch for class A
# 所有類預設繼承了Object類,A也繼承了Object,所以當你讓A繼承String時就會報錯

 

Ruby學習-第二章

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.