久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Ruby語(yǔ)言學(xué)習(xí)手記

 思考的軌跡 2012-02-15

Ruby語(yǔ)言學(xué)習(xí)手記

  • Ruby大小寫敏感
  • 單行注釋以#號(hào)開(kāi)頭,多行以=begin開(kāi)頭,,以=end結(jié)尾
  • 文件尾加入__END__,Ruby編譯器會(huì)處理到這里結(jié)束,,余下的內(nèi)容可以通過(guò)IO流對(duì)象DATA來(lái)讀取
  • 標(biāo)識(shí)符里的標(biāo)點(diǎn)符號(hào)及含義
    • $ 全局變量以美元符號(hào)開(kāi)頭,,Ruby也定義了一些包含其他標(biāo)符號(hào)的全局變量,如:$_ and $_K
    • @ 實(shí)例變量以一個(gè)@開(kāi)頭,,而類變量是以兩個(gè)@開(kāi)頭
    • ? 作為一個(gè)有用的慣例,,那些返回布爾值的方法名通常以一個(gè)問(wèn)號(hào)結(jié)尾
    • ! 一些要小心使用的方法名要以感嘆號(hào)結(jié)尾,這樣的方法通常會(huì)改變調(diào)用它們的對(duì)像
    • = 以等號(hào)結(jié)尾的方法在被調(diào)用時(shí)可以省略此等號(hào),,通常被置于賦值操作符的左側(cè)
  • print和puts的作用都是字符輸出,,但puts會(huì)在行尾加個(gè)換行符,另外還支持printf和sprintf,。
  • 換行符是ruby默認(rèn)的語(yǔ)句終結(jié)符,,當(dāng)然也可以用分號(hào),但不是必須,,只有試圖在一行代碼里放置多條語(yǔ)句時(shí)需要用到,,除此之外分號(hào)都會(huì)被忽略掉??梢岳?\ 來(lái)對(duì)換行符進(jìn)行轉(zhuǎn)義,,這樣就可以把兩行代碼當(dāng)做一行處理。
  • 在Ruby1.9里,,如果一行代碼是以一個(gè)句點(diǎn)開(kāi)始,,那這行將被當(dāng)成上一行的延續(xù),而且在該行語(yǔ)句之前的換行符也不被當(dāng)成語(yǔ)句終結(jié)符,。例如:
animals = Array.new
	.push("dog")
	.push("cow")
	.sort
  • 關(guān)于代碼塊縮進(jìn),,Ruby的慣例是兩個(gè)空格
  • 通常情況下,如果代碼塊中的代碼多于一行,,就采用do和end分界符,,否則就使用{和}分界符,。例如:
# 只有一行的代碼塊
1.times { print "Ruby!" }
# 多行代碼塊
1.upto(10) do |x|
  print x
  print x + 1
end
  • 如果想自定義Unix系統(tǒng)對(duì)于ruby文件的執(zhí)行方式(稱為shebang注釋),文件的第一行應(yīng)加入類似如下語(yǔ)句,,該語(yǔ)句必須位于第一行,。
#!/usr/bin/ruby -w
  • 如果需要為ruby文件定義編碼,那么編碼需要在第二行,,如果沒(méi)有定義執(zhí)行方式的代碼,,那么就應(yīng)該在第一行,編碼名稱不區(qū)分大小寫,,如果一個(gè)文件頭三個(gè)字節(jié)是0xEF 0xBB 0xBF,,那么該文件的編碼方式就是UTF-8,這三個(gè)字節(jié)也稱為BOM(Byte Order Mark的縮寫),。
# coding: utf-8
# Emacs用戶可以像下面這樣寫
# -*- coding: utf-8 -*-
# vi用戶可以這樣
# vi: set fileencoding=utf-8 :
  • 用require載入代碼,,可以保證不會(huì)重復(fù)載入指定的代碼
  • Ruby不像C或Java那樣的靜態(tài)編譯型語(yǔ)言,有著像main這樣的入口方法,,他是從第一行代碼一直執(zhí)行到最后,,所以函數(shù)或類的定義代碼必須放在調(diào)用代碼的前面。
  • 像PHP,,Ruby的純字符串也是由兩個(gè)單引號(hào)首尾構(gòu)成,,如果用了雙引號(hào),,那么字符串里的一些轉(zhuǎn)義序列(如:\n)和表達(dá)式將會(huì)被編譯器處理,,另外雙引號(hào)的字符串還支持跨越多行,如果想讓一行長(zhǎng)字符串分多行表示,,只要在每行結(jié)尾加入反斜杠(\),。
  • 以反引號(hào)(`)來(lái)引用的文本,Ruby會(huì)將字符串以操作系統(tǒng)命令來(lái)執(zhí)行,,并將輸出的結(jié)果作為字符串返回,。以命令 ls 為例,與反引號(hào)(`)等價(jià)的表示方式還有:%x[ls] ,。
  • 對(duì)于處理很長(zhǎng)的甚至包含各種奇怪字符的字符串,,可以用here document來(lái)處理,以<<后面緊跟一個(gè)用于指定結(jié)尾分界符的標(biāo)識(shí)符和字符串,,通常為大寫,。
  • 應(yīng)該避免在循環(huán)中使用字符串,因?yàn)樵赗uby中,,每個(gè)字符串都是被看做一個(gè)對(duì)象,,而每次循環(huán)都會(huì)新建一個(gè)對(duì)象,可以運(yùn)行下面的代碼來(lái)證明這一點(diǎn):
10.times { puts "test".object_id }
  • 加號(hào)(+)雖然也是字符串的連接符,,但是和Java不一樣,,加號(hào)操作符不會(huì)自動(dòng)轉(zhuǎn)換右側(cè)的操作數(shù)為字符,,必須自己手動(dòng)轉(zhuǎn)換,否則報(bào)錯(cuò),。例如:
# to_s將操作數(shù)轉(zhuǎn)換成字符串
"Hello planet #" + planet_number.to_s
# 但是采用 #{ 和 } 在字符串插入表達(dá)式的方式會(huì)比用+號(hào)更方便,,如:
"Hello planet ##{planet_number}"
  • << 操作符會(huì)將第二個(gè)參數(shù)添加到左側(cè)的操作數(shù)后面,并不會(huì)創(chuàng)建新對(duì)象,。例如:
greeting = "Hello"
greeting << " World"
puts greeting
# Outputs "Hello World"
  • Ruby1.9為字符串提供了三種循環(huán)方法:each_byte(按字切進(jìn)行循環(huán)),、each_char(按字符進(jìn)行循環(huán))、each_line(按行進(jìn)行循環(huán)),,這要比使用[index, length]方法更高效,。例如:
s = "$1000"
s.each.char { |x| print "#{x}" }
  • Ruby中,以true和false來(lái)代表真和假,、開(kāi)和關(guān),,以nil來(lái)表示空值。
  • 就像Actionscript一樣,,在Ruby中使用對(duì)象,,事實(shí)上也是在使用對(duì)象的引用,就是說(shuō)當(dāng)將一個(gè)值賦值給一個(gè)變量時(shí),,并沒(méi)有將一個(gè)對(duì)象拷貝到該變量中,,而是在此變量中存儲(chǔ)了一個(gè)指向那個(gè)對(duì)象的引用。例如:
s = "Ruby"
t = s
t[-1] = ""
print s
# outputs "Rub"

Arrays

  • 可以用加號(hào)(+),、減號(hào)(-)或乘號(hào)(*)來(lái)操作數(shù)組,,例如:
['a', 'b'] + ['c']
# ['a', 'b', 'c']
['a', 'b', 'c'] - ['b']
# ['a', 'c']
[0] * 8
# [0, 0, 0, 0, 0, 0, 0, 0]
  • 當(dāng)然也可以用<< 來(lái)添加元素,例如:
a = []
a << 1 << 2
# a is [1, 2]
  • 也可以用與(&)操作符取交集,、或(|)操作符取并集來(lái)操作數(shù)組,,例如:
a = [1, 1, 2, 2, 3, 3, 4]
b = [5, 5, 4, 4, 3, 3, 2]
a | b
# [1, 2, 3, 4, 5]
b | a
# [5, 4, 3, 2, 1]
a & b
# [2, 3, 4]
b & a
# [4, 3, 2]

Hashes

  • Map是由鍵值構(gòu)成,鍵有兩種表現(xiàn)方式,,字符串(string)和符號(hào)(symbol),,一般用符號(hào)會(huì)更高效,兩種表現(xiàn)形式如下:
# 字符串方式
numbers = { "one" => 1, "two" => 2 }
# 符號(hào)方式
numbers = { :one => 1, :two => 2 }
# Ruby 1.9 支持下面更簡(jiǎn)潔的表示方式,,有點(diǎn)像Json
numbers = { one: 1, two: 2 }

Ranges

  • Range 對(duì)象表示位于一個(gè)開(kāi)始值和結(jié)束值之間的一些值,,例如:
a = 0..10
b = 'a'..'c'
('b'..'d').to_a
# ['b', 'c', 'd']
# 返回5是否在a的范圍內(nèi)
a.member? 5
# 返回true

Symbols

  • 相對(duì)于字符串(String)每次新建一個(gè)新對(duì)象,Symbol對(duì)系統(tǒng)開(kāi)銷就很少,,最普遍的應(yīng)用是在Hash上,,在Hash已經(jīng)提到。

Methods

  • Methods定義
def say_hello(name)
  result = "Hi, " + name
  return result
end
# ruby可以將方法最后一行的運(yùn)算結(jié)果自動(dòng)return,,所以上面方法還可以簡(jiǎn)化成
def say_hello(name)
  "Hi, " + name
end

Classes

  • Class定義
class Person
  def initialize(name) # 構(gòu)造函數(shù)
    @name = name
  end
  def say(word)
    pus "#{word}, #{@name}" #字串相加
  end
end
p1 = Person.new("Bindiry")
p1.say("Hello")
# 輸出Hello, Bindiry
  • 類方法和變量
class Person
  @@name = "Bindiry"
  def self.say
    puts @@name
  end
end
Person.say
# 輸出 Bindiry
# 所有的實(shí)例變量(@開(kāi)頭)和類變量(@@開(kāi)頭)都只能在類內(nèi)部訪問(wèn),,外部無(wú)法存取
# 為了能夠讀取實(shí)例變量,必須定義方法:
class Person
  def initialize(name)
    @name = name
  end
  def name
    @name
  end
  def name=(name)
    @name = name
  end
end
p = Person.new('Bindiry')
p.name 
=> "Bindiry"
p.name="peny"
=> "peny"
# 更簡(jiǎn)潔的實(shí)例變量訪問(wèn)方法
class Person
  attr_accessor :name
end
# 同樣還有只讀和只寫: attr_reader,、attr_writer
  • 方法封裝

類中默認(rèn)的方法是public的,,要設(shè)置成private或protected,,可以用如下代碼:

 class MyClass

  def public_method
  end

  private

  def private_method1
  end

  def private_method2
  end
  
  protected

  def protected_method1
  end

  def protected_method2
  end

end

Ruby中的private和protected和其他語(yǔ)言不太一樣,都是可以在整個(gè)繼承體系中被調(diào)用,。

  • 類繼承
class Pet
  attr_accessor :name, :age
  def say(word)
    puts "Say: #{word}"
  end
end

class Cat < Pet
  def say(word)
    puts "Meow~"
    super
  end
end

Cat.new.say("Hi")

循環(huán)體和迭代器

languages = ['Ruby', 'Javascript', 'Perl']
languages.each do |lang|
  puts "I love #{lang}!"
end
# I Love Ruby
# I Love Javascript
# I Love Perl
# 重復(fù)三次
3.times do
  puts 'Good Job!'
end
# Good Job!
# Good Job!
# Good Job!

# 從1到9,,注:?jiǎn)涡锌捎么罄ㄌ?hào)形式
1.upto(9) { |x| puts x }

# 使用索引變量
languages = ['Ruby', 'Javascript', 'Perl']
languages.each_with_index do |lang, i|
  puts "#{i}, I love #{lang}!"
end
# 0, I Love Ruby
# 1, I Love Javascript
# 2, I Love Perl

Module

Module和Class很相似,也是在內(nèi)部定義方法(Method),,只是不能用new來(lái)創(chuàng)建,,多數(shù)被當(dāng)做命名空間(Namespace)來(lái)放一些工具方法。

 module MyUtil
  def self.foobar
    puts "foobar"
  end
end

MyUtil.foobar
# 輸出 foobar

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多