校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > Ruby 魔法 學習筆記之一

Ruby 魔法 學習筆記之一

熱門標簽:漯河電銷 巫師3地圖標注魔力之所 天津外呼系統怎么收費 柯城手機地圖如何做地圖標注 征服者企業地圖標注 外呼線路從哪里出來的 淮安自動外呼系統供應商 中牟外呼系統違法嗎 AI電銷機器人 線路
一、向對象顯示的發送消息
我們可以向對象直接發送消息:
Ruby代碼
復制代碼 代碼如下:

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

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

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這樣優美
的code,我們打開Array,并定義一個sort_by方法:
Ruby代碼
class Array
def sort_by(sysm)
self.sort{|x,y| x.send(sym) => y.send(sym)}
end
end
我們看看運行結果:
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]
這個結果是如何得到的呢?
其實除了send外還有一個地方應該注意attr_reader,attr_reader相當于定義了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
我們發現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這個對象的。
和設計模式singleton object類似,只會發生一次的東東我們叫singleton.
self 給你定義的class添加行為
Ruby代碼
class TheClass
class self
def hello
puts "hello!"
end
end
end
TheClass.hello #hello!
self修改了你定義class的class,這是個很有用的技術,他可以定義class級別
的helper方法,然后在這個class的其他的定義中使用。下面一個列子定義了訪問
函數,我們希望訪問的時候把成員數據都轉化成string,我們可以通過這個技術來
定義一個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
三、創建一個可參數化的類:
如果我們要創建很多類,這些類只有類成員的初始值不同,我們很容易想起:
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中的類成員不僅在這個類中被所有對象共享,
實際上會被整個繼承體系共享,所以我們調用Terran.home_planet,會輸出
“Mars”,而我們期望的是Earth
一個可行的方法:
我們可以通過class_eval在運行時延遲求值來達到目標:
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中最難理解的概念了,它可以處理非局部的跳轉,
它保存了返回地址和執行的環境,和c中的setjmp和longjump類似,但它保存
了更多的信息:
axgle舉的曹操的例子很形象,我們拿過來看看:
來自[http://www.javaeye.com/topic/44271]
曹操(caocao)被譽為“古代輕功最好的人 ”,是因為“說曹操,曹操到”這句名言。
在ruby中,曹操的這種輕功被稱為callcc.
Ruby代碼
callcc{|caocao|
for say in ["曹操","諸葛亮","周瑜"]
caocao.call if say=="曹操"
puts say #不會輸出,因為曹操已經飛出去了
end
}#“曹操”飛到這里來了(跳出了callcc的block,緊跟在這個block后面,繼續執行下面的ruby代碼)
puts "到"
callcc里的caocao是個"延續"(Continuation)對象.這個對象只有名叫“call"的這樣一個方法。
當執行了caocao.call后,caocao就會飛到callcc的塊(block)后面,讓ruby繼續執行其下面的代碼。
我上面給出的是一個從塊里頭”飛“到塊外面的例子;下面是Programming Ruby給出的從代碼后面”飛“到代碼前面的例子:
Ruby代碼
arr = [ "Freddie", "Herbie", "Ron", "Max", "Ringo" ]
callcc{|$cc|}#下面的$cc.call如果被執行,就會飛回到這里(callcc的塊之后)。
puts(message = arr.shift)
$cc.call unless message =~ /Max/
例子大多來自The ruby way>>
您可能感興趣的文章:
  • Ruby學習筆記之gem 命令詳解
  • ruby 學習筆記(2) 類的基本使用
  • ruby 學習筆記(1) 初識語法
  • Ruby學習筆記一

標簽:大慶 西雙版納 甘孜 棗莊 河池 南昌 克拉瑪依 內江

巨人網絡通訊聲明:本文標題《Ruby 魔法 學習筆記之一》,本文關鍵詞  Ruby,魔法,學習,筆記,之一,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Ruby 魔法 學習筆記之一》相關的同類信息!
  • 本頁收集關于Ruby 魔法 學習筆記之一的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    亚洲免费在线视频一区 二区| 成人一区在线观看| 欧美日韩精品专区| 亚洲制服欧美中文字幕中文字幕| 91视频你懂的| 一区二区三区高清在线| 在线观看区一区二| 免费国产亚洲视频| 久久影院电视剧免费观看| 国产成人精品亚洲777人妖| 国产日韩欧美制服另类| av电影天堂一区二区在线| 亚洲人吸女人奶水| 欧美一区二区三区不卡| 极品尤物av久久免费看| 中文字幕不卡在线播放| 欧美在线免费观看视频| 日本系列欧美系列| 国产女主播在线一区二区| 97超碰欧美中文字幕| 午夜激情久久久| 欧美精品一区二区三区视频| www.爱久久.com| 午夜欧美大尺度福利影院在线看| 精品成人私密视频| 91在线视频免费91| 久草在线在线精品观看| 亚洲欧洲综合另类| 欧美草草影院在线视频| 91在线无精精品入口| 精品一区二区三区在线播放视频| 国产精品久久久久久久久搜平片| 色婷婷av一区二区三区软件| 久久福利资源站| 亚洲欧美色图小说| 久久精子c满五个校花| 欧美性猛交xxxx黑人交| 国产不卡视频一区二区三区| 午夜在线成人av| 中文字幕一区二区三区av| 久久久精品蜜桃| 欧美日本免费一区二区三区| 99久久精品免费看国产| 韩国av一区二区三区在线观看| 亚洲狠狠丁香婷婷综合久久久| 欧美一区欧美二区| 一本色道久久加勒比精品 | av资源站一区| 久久99久久99| 亚洲成精国产精品女| 亚洲视频在线一区观看| 精品处破学生在线二十三| 欧美久久久久久久久中文字幕| 成人sese在线| 成人深夜视频在线观看| 九九热在线视频观看这里只有精品| 亚洲国产另类av| 亚洲裸体在线观看| 国产精品美女久久久久av爽李琼| 26uuu久久综合| 欧美mv日韩mv亚洲| 欧美一级免费大片| 欧美精品成人一区二区三区四区| 一本色道久久加勒比精品| 成人黄色免费短视频| 国产成人精品免费一区二区| 精品一二三四区| 国精品**一区二区三区在线蜜桃| 日韩成人一级片| 视频一区欧美精品| 日韩av网站在线观看| 视频在线观看91| 奇米色一区二区| 美日韩黄色大片| 亚洲欧美视频在线观看视频| 欧洲精品中文字幕| 99久久99久久免费精品蜜臀| 国产高清久久久| 免费欧美高清视频| 性久久久久久久久| 午夜视频在线观看一区二区三区| 午夜免费久久看| 一二三区精品福利视频| 婷婷成人综合网| 午夜天堂影视香蕉久久| 日本在线播放一区二区三区| 中文字幕色av一区二区三区| 自拍偷拍欧美精品| 国产亚洲一区二区三区在线观看 | 亚洲精品在线观看网站| 欧美日韩综合色| 欧美一级日韩免费不卡| 91精品免费在线观看| 精品人在线二区三区| 欧美一区二区成人6969| 精品国产乱码久久久久久久| 欧美mv日韩mv国产网站app| 久久久精品欧美丰满| 久久亚洲捆绑美女| 中文字幕一区二区三区蜜月 | 婷婷夜色潮精品综合在线| 日韩高清一区在线| 三级不卡在线观看| 国产精品911| eeuss鲁片一区二区三区在线看| 色婷婷av一区二区三区大白胸| 欧洲色大大久久| 久久看人人爽人人| 欧美国产日韩精品免费观看| 亚洲主播在线播放| 奇米一区二区三区| 99国产精品国产精品久久| 91久久精品一区二区三| 91.com视频| 久久综合网色—综合色88| 国产欧美日韩精品一区| 欧美三片在线视频观看| 久久综合九色综合欧美就去吻| 国产九九视频一区二区三区| 在线免费观看视频一区| 3751色影院一区二区三区| 国产成人亚洲综合色影视| 免费观看在线色综合| 成人午夜视频免费看| 北条麻妃国产九九精品视频| 日韩一区二区在线观看视频| 久久天堂av综合合色蜜桃网| 亚洲午夜av在线| 久久97超碰色| 欧美日韩一本到| 亚洲天堂免费看| 另类成人小视频在线| 色综合久久久久综合99| 91精品国产品国语在线不卡| 日韩一区中文字幕| 日韩电影一二三区| 国产在线播放一区| 欧美亚洲日本国产| 国产精品婷婷午夜在线观看| 亚洲乱码国产乱码精品精98午夜| 国产一区二区精品久久99 | 日日夜夜免费精品| 精一区二区三区| 欧美精品一二三| 国产视频一区二区三区在线观看| 日本不卡不码高清免费观看| 国产成人aaaa| 日韩免费在线观看| 亚洲欧洲日韩综合一区二区| 青青草精品视频| 欧美亚洲一区三区| 国产精品国产三级国产普通话99 | 免费观看一级特黄欧美大片| 欧洲人成人精品| 久久青草欧美一区二区三区| 麻豆国产精品视频| 91蜜桃免费观看视频| 久久久午夜电影| 国产一区在线观看视频| 欧美日韩激情一区| 亚洲一区二区三区四区五区黄| 国产电影一区二区三区| 国产片一区二区| 青青青伊人色综合久久| 日韩欧美自拍偷拍| 亚洲色图视频网| 一本大道综合伊人精品热热| 亚洲欧美综合另类在线卡通| 国产福利一区二区三区视频| 久久精品亚洲国产奇米99| 免费成人结看片| 精品区一区二区| 久久99国产精品久久99果冻传媒| 亚洲精品一区二区精华| 男男视频亚洲欧美| 日韩三级中文字幕| 三级欧美在线一区| 精品成人一区二区三区| 丝袜国产日韩另类美女| 日韩欧美资源站| 国产一区二区伦理片| 26uuu久久综合| 成人的网站免费观看| 国产人久久人人人人爽| 成人白浆超碰人人人人| 国产精品三级av| 欧美色男人天堂| 丝袜亚洲另类丝袜在线| 日韩欧美综合一区| 东方aⅴ免费观看久久av| 国产精品欧美一区二区三区| 在线视频国内一区二区| 亚洲精品国产一区二区精华液 | 国产大陆精品国产| 成人免费在线观看入口| 欧美性做爰猛烈叫床潮| 亚洲va国产天堂va久久en| 26uuu另类欧美亚洲曰本| 国产精品中文字幕日韩精品| 亚洲欧美激情在线|