好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > Ruby 魔法 學(xué)習(xí)筆記之一

Ruby 魔法 學(xué)習(xí)筆記之一

熱門標(biāo)簽:漯河電銷 巫師3地圖標(biāo)注魔力之所 天津外呼系統(tǒng)怎么收費(fèi) 柯城手機(jī)地圖如何做地圖標(biāo)注 征服者企業(yè)地圖標(biāo)注 外呼線路從哪里出來的 淮安自動外呼系統(tǒng)供應(yīng)商 中牟外呼系統(tǒng)違法嗎 AI電銷機(jī)器人 線路
一、向?qū)ο箫@示的發(fā)送消息
我們可以向?qū)ο笾苯影l(fā)送消息:
Ruby代碼
復(fù)制代碼 代碼如下:

class HelloWorld
def say(name)
print "Hello, ", name
end
end
hw = HelloWorld.new
hw.send(:say,"world")

我們通常使用hw.say("world"),但send可以對private的方法起作用。
不光如此send可以使程序更加動態(tài),下面我們看看一個例子:
我們定義了一個類Person,我們希望一個包含Person對象的數(shù)組能夠按
照Person的任意成員數(shù)據(jù)來排序:
Ruby代碼
復(fù)制代碼 代碼如下:

class Person
attr_reader :name,:age,:height
def initialize(name,age,height)
@name,@age,@height = name,age,height
end
def inspect
"#@name #@age #@height"
end
end
在ruby中任何一個類都可以隨時打開的,這樣可以寫出像2.days_ago這樣優(yōu)美
的code,我們打開Array,并定義一個sort_by方法:
Ruby代碼
class Array
def sort_by(sysm)
self.sort{|x,y| x.send(sym) => y.send(sym)}
end
end
我們看看運(yùn)行結(jié)果:
Ruby代碼
people = []
people Person.new("Hansel",35,69)
people Person.new("Gretel",32,64)
people Person.new("Ted",36,68)
people Person.new("Alice", 33, 63)
p1 = people.sort_by(:name)
p2 = people.sort_by(:age)
p3 = people.sort_by(:height)
p p1 # [Alice 33 63, Gretel 32 64, Hansel 35 69, Ted 36 68]
p p2 # [Gretel 32 64, Alice 33 63, Hansel 35 69, Ted 36 68]
p p3 # [Alice 33 63, Gretel 32 64, Ted 36 68, Hansel 35 69]
這個結(jié)果是如何得到的呢?
其實除了send外還有一個地方應(yīng)該注意attr_reader,attr_reader相當(dāng)于定義了name,
age,heigh三個方法,而Array里的sort方法只需要提供一個比較方法:
x.send(sym) => y.send(sym) 通過send得到person的屬性值,然后在使用=>比較
二、定制一個object
object
ruby不僅可以打開一個類,而且可以打開一個對象,給這個對象添加或定制功能,而不影響
其他對象:
Ruby代碼
a = "hello"
b = "goodbye"
def b.upcase
gsub(/(.)(.)/)($1.upcase + $2)
end
puts a.upcase #HELLO
puts b.upcase #GoOdBye
我們發(fā)現(xiàn)b.upcase方法被定制成我們自己的了
如果想給一個對象添加或定制多個功能,我們不想多個def b.method1 def b.method2這么做
我們可以有更模塊化的方式:
Ruby代碼
b = "goodbye"
class b
def upcase # create single method
gsub(/(.)(.)/) { $1.upcase + $2 }
end
def upcase!
gsub!(/(.)(.)/) { $1.upcase + $2 }
end
end
puts b.upcase # GoOdBye
puts b # goodbye
b.upcase!
puts b # GoOdBye
這個class被叫做singleton class,因為這個class是針對b這個對象的。
和設(shè)計模式singleton object類似,只會發(fā)生一次的東東我們叫singleton.
self 給你定義的class添加行為
Ruby代碼
class TheClass
class self
def hello
puts "hello!"
end
end
end
TheClass.hello #hello!
self修改了你定義class的class,這是個很有用的技術(shù),他可以定義class級別
的helper方法,然后在這個class的其他的定義中使用。下面一個列子定義了訪問
函數(shù),我們希望訪問的時候把成員數(shù)據(jù)都轉(zhuǎn)化成string,我們可以通過這個技術(shù)來
定義一個Class-Level的方法accessor_string:
Ruby代碼
class MyClass
class self
def accessor_string(*names)
names.each do |name|
class_eval -EOF
def #{name}
@#{name}.to_s
end
EOF
end
end
end
def initialize
@a = [ 1, 2, 3 ]
@b = Time.now
end
accessor_string :a, :b
end
o = MyClass.new
puts o.a # 123
puts o.b # Fri Nov 21 09:50:51 +0800 2008
通過extend module給你的對象添加行為,module里面的方法變成了對象里面的
實例方法:
Ruby代碼
module Quantifier
def any?
self.each { |x| return true if yield x }
false
end
def all?
self.each { |x| return false if not yield x }
true
end
end
list = [1, 2, 3, 4, 5]
list.extend(Quantifier)
flag1 = list.any? {|x| x > 5 } # false
flag2 = list.any? {|x| x >= 5 } # true
flag3 = list.all? {|x| x = 10 } # true
flag4 = list.all? {|x| x % 2 == 0 } # false
三、創(chuàng)建一個可參數(shù)化的類:
如果我們要創(chuàng)建很多類,這些類只有類成員的初始值不同,我們很容易想起:
Ruby代碼
class IntelligentLife # Wrong way to do this!
@@home_planet = nil
def IntelligentLife.home_planet
@@home_planet
end
def IntelligentLife.home_planet=(x)
@@home_planet = x
end
#...
end
class Terran IntelligentLife
@@home_planet = "Earth"
#...
end
class Martian IntelligentLife
@@home_planet = "Mars"
#...
end
這種方式是錯誤的,實際上Ruby中的類成員不僅在這個類中被所有對象共享,
實際上會被整個繼承體系共享,所以我們調(diào)用Terran.home_planet,會輸出
“Mars”,而我們期望的是Earth
一個可行的方法:
我們可以通過class_eval在運(yùn)行時延遲求值來達(dá)到目標(biāo):
Ruby代碼
class IntelligentLife
def IntelligentLife.home_planet
class_eval("@@home_planet")
end
def IntelligentLife.home_planet=(x)
class_eval("@@home_planet = #{x}")
end
#...
end
class Terran IntelligentLife
@@home_planet = "Earth"
#...
end
class Martian IntelligentLife
@@home_planet = "Mars"
#...
end
puts Terran.home_planet # Earth
puts Martian.home_planet # Mars
最好的方法:
我們不使用類變量,而是使用類實例變量:
Ruby代碼
class IntelligentLife
class self
attr_accessor :home_planet
end
#...
end
class Terran IntelligentLife
self.home_planet = "Earth"
#...
end
class Martian IntelligentLife
self.home_planet = "Mars"
#...
end
puts Terran.home_planet # Earth
puts Martian.home_planet # Mars
四、Ruby中的Continuations:
Continuations恐怕是Ruby中最難理解的概念了,它可以處理非局部的跳轉(zhuǎn),
它保存了返回地址和執(zhí)行的環(huán)境,和c中的setjmp和longjump類似,但它保存
了更多的信息:
axgle舉的曹操的例子很形象,我們拿過來看看:
來自[http://www.javaeye.com/topic/44271]
曹操(caocao)被譽(yù)為“古代輕功最好的人 ”,是因為“說曹操,曹操到”這句名言。
在ruby中,曹操的這種輕功被稱為callcc.
Ruby代碼
callcc{|caocao|
for say in ["曹操","諸葛亮","周瑜"]
caocao.call if say=="曹操"
puts say #不會輸出,因為曹操已經(jīng)飛出去了
end
}#“曹操”飛到這里來了(跳出了callcc的block,緊跟在這個block后面,繼續(xù)執(zhí)行下面的ruby代碼)
puts "到"
callcc里的caocao是個"延續(xù)"(Continuation)對象.這個對象只有名叫“call"的這樣一個方法。
當(dāng)執(zhí)行了caocao.call后,caocao就會飛到callcc的塊(block)后面,讓ruby繼續(xù)執(zhí)行其下面的代碼。
我上面給出的是一個從塊里頭”飛“到塊外面的例子;下面是Programming Ruby給出的從代碼后面”飛“到代碼前面的例子:
Ruby代碼
arr = [ "Freddie", "Herbie", "Ron", "Max", "Ringo" ]
callcc{|$cc|}#下面的$cc.call如果被執(zhí)行,就會飛回到這里(callcc的塊之后)。
puts(message = arr.shift)
$cc.call unless message =~ /Max/
例子大多來自The ruby way>>
您可能感興趣的文章:
  • Ruby學(xué)習(xí)筆記之gem 命令詳解
  • ruby 學(xué)習(xí)筆記(2) 類的基本使用
  • ruby 學(xué)習(xí)筆記(1) 初識語法
  • Ruby學(xué)習(xí)筆記一

標(biāo)簽:大慶 西雙版納 甘孜 棗莊 河池 南昌 克拉瑪依 內(nèi)江

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Ruby 魔法 學(xué)習(xí)筆記之一》,本文關(guān)鍵詞  Ruby,魔法,學(xué)習(xí),筆記,之一,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Ruby 魔法 學(xué)習(xí)筆記之一》相關(guān)的同類信息!
  • 本頁收集關(guān)于Ruby 魔法 學(xué)習(xí)筆記之一的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 免费很黄很暴力的视频| 成人免费动作大片黄在线| 亚洲你懂的| 91黄色在线| 做床爱无遮挡免费视频软件| 一级毛片一级**| 我和乖女小芳的婬乱生活h| 成人H秘?小说在线阅读老师| 国产精品久久久久岛| 老师在办公室被躁得舒服小说| 九色影视| 国产成人精品一区二区三区视频| 欧美精品福利在线视频| 回到乡下被h嗯啊bl| 黄篇视频| 聊斋之欲焰三娘子| 裸色生香| 别揉我胸嗯啊| 91孕妇精品一区二区三区| 91情侣在线视频| 猎户粗又长h一女多男| 久久大香香蕉国产免费网站| 天天爱天天做天天爽夜夜揉| 一级免费| 无码精品日韩专区第一页| 国产一区二区精品久久岳√| 女人和拘做受大片免费看| 亚洲国产成人精品女人久久久| 操美女的逼| 91啦丨九色丨蚪窝人妻| 免费b站推广网站在线| japanesexxxx日本妞| 色情亂伦视频免费国产片| 天堂国产精产国品在线观看 | 无码人妻精产国品一二三产区区别 | 艳史婬乱史1~5集| 麻豆免费视频网站入口| 爆乳尤物▌奈汐酱Nice▌| 狠狠干最新网址| 色妞女女女女女bbbbb1| 日日摸天天摸狠狠摸摸91|