柚子快報(bào)激活碼778899分享:博客 Ruby設(shè)計(jì)-基礎(chǔ)語(yǔ)法
柚子快報(bào)激活碼778899分享:博客 Ruby設(shè)計(jì)-基礎(chǔ)語(yǔ)法
一、腳本語(yǔ)言
? 我似乎對(duì)于 Python 和 Ruby 強(qiáng)求太多了,我要讓他們實(shí)現(xiàn) C 的所有功能。他們確實(shí)可以實(shí)現(xiàn)所有的功能,但是他們的目的不是為了這個(gè)。
? 我也可以用 shell 實(shí)現(xiàn)很多復(fù)雜的算法,但是我絕對(duì)不會(huì)用他去寫圖著色或者動(dòng)態(tài)規(guī)劃。但是我使用 python 和 Ruby 的時(shí)候卻又這種傾向。我不會(huì)強(qiáng)求 C 為我列出目錄中的所有文件,但是我卻會(huì)強(qiáng)求 python,可嘆啊。
? 我之前似乎把語(yǔ)言看成了算法和架構(gòu)的載體和實(shí)現(xiàn),怪不得過(guò)得這么不幸福。
二、調(diào)用命令
? 神奇用法,可以直接調(diào)用 ls 這樣的指令。
print <<`EOC` # 執(zhí)行命令
ls -al
EOC
? 這或許進(jìn)一步說(shuō)明了它就是個(gè)腳本。
三、外部傳參
? ruby 的腳本調(diào)用的時(shí)候是可以傳參的,下面的腳本
puts ARGV.class
puts ARGV.first
puts ARGV.last
puts ARGV[1]
? 如果在 zsh 中輸入
ruby argv.rb 1 2 3
? 那么輸出是
Array
1
3
2
? 就是將后面的輸入視為一個(gè)數(shù)組,原理比較顯然。
四、輸入輸出
? 輸出比較簡(jiǎn)單的是 puts 類似于 C 語(yǔ)言中 puts(有種傳言說(shuō) ruby 特意模仿了一些 C)。如果想要格式化輸出,也是可以的,見下
# format output
puts "Hello %s" %["cnx"]
puts "Hello %c" %[65]
puts "Hello %x" %[2147483648]
months = "Jan\nFeb\nMar\nApr\nMay\nJun\nJul\nAug"
puts months
? 輸入沒(méi)有細(xì)致探討過(guò),似乎這個(gè)是可以的
# input
a = gets.chomp
puts a
五、文件操作
? 跟 C 依然很像,太像了
filename = ARGV.first
script = $0
puts "Opening the file..."
target = File.open(filename, 'w')
puts "Truncating the file. Goodbye!"
target.truncate(target.size)
puts "Now I'm going to ask you for three lines."
print "line 1: "; line1 = STDIN.gets.chomp()
print "line 2: "; line2 = STDIN.gets.chomp()
print "line 3: "; line3 = STDIN.gets.chomp()
puts "I'm going to write these to the file."
target.write(line1)
target.write("\n")
target.write(line2)
target.write("\n")
target.write(line3)
target.write("\n")
puts "And finally, we close it."
target.close()
src = File.open(filename, "r")
indata = src.read()
puts "The input file is #{indata.length} bytes long"
puts "The input data is "
puts indata
六、數(shù)據(jù)結(jié)構(gòu)
6.1 Hash
? HashMap 的意思,感覺比 Java 的還好用,語(yǔ)法有點(diǎn)像 C++。
grades = {'CNX' => 100, 'QS' => 0, 'LSZ' => 120}
puts grades['CNX']
grades['QS'] = 20
grades.each do |name, grade|
puts "#{name} : #{grade}"
end
6.2 語(yǔ)句塊
? 這是一個(gè)很有意思的東西,就是我們可以定義一個(gè)被叫做“塊“的結(jié)構(gòu),有兩種寫法
do |x|
x *= x
puts x
end
{|x| x *= x; puts x}
然后這個(gè)塊結(jié)構(gòu)就可以作為函數(shù)參數(shù)傳參了(感覺有點(diǎn)函數(shù)式和匿名函數(shù)的意思了),比如說(shuō)這個(gè)
grades.each do |name, grade|
puts "#{name} : #{grade}"
end
? 其實(shí)是作為 hash 的 grades 對(duì)象調(diào)用 each 方法,這個(gè)方法有一個(gè)參數(shù),就是這個(gè)塊
grades.each (do |name, grade|
puts "#{name} : #{grade}"
end)
6.3 整數(shù)
? 取整的時(shí)候是向下取整,而不是向零取整,這點(diǎn)與 C 或者 Java 不同,但是與 Python 相同。
6.4 Array
? 聲明形式是這樣的
a = [1, 2, 3, 4]
? 有的時(shí)候還可以騷一點(diǎn)
a = Array.new(4) {|i| i + 1}
? 對(duì)于數(shù)組的索引訪問(wèn),跟 python 一樣強(qiáng)大,支持負(fù)數(shù)。
puts a[0] # 1
puts a[-1] # 4
? 和 python 一樣,支持切片
b = Array.new(5) {|i| (i + 'A'.ord).chr}
printf "%s\n", b # "A", "B", "C", "D", "E"]
printf "%s\n", b[1, 3] # ["B", "C", "D"]
printf "%s\n", b[2..4] # ["C", "D", "E"]
? 同時(shí)有了一堆好用的操作符
c = [1, 2, 3]
puts c.to_s # [1, 2, 3]
c += [4, 5, 1]
puts c.to_s # [1, 2, 3, 4, 5, 1]
c -= [1, 4, 5]
puts c.to_s # [2, 3]
c *= 3
puts c.to_s # [2, 3, 2, 3, 2, 3]
c << 5
puts c.to_s # [2, 3, 2, 3, 2, 3, 5]
6.5 Range
? 似乎 python 中也有這種結(jié)構(gòu),但是這個(gè)似乎被當(dāng)成了獨(dú)立的一種內(nèi)置的數(shù)據(jù)結(jié)構(gòu)
(1..5) #==> 1, 2, 3, 4, 5
(1...5) #==> 1, 2, 3, 4
('a'..'d') #==> 'a', 'b', 'c', 'd'
6.6 Symbol
? 符號(hào),就是編譯原理里符號(hào)表里的那個(gè)符號(hào),Ruby 的神奇就在于可以直接在程序中定義這個(gè)符號(hào),方法是加個(gè)標(biāo)識(shí)符
a = :s
puts a
b = :"s"
puts b
puts b.equal?a # true
七、注釋
單行注釋
# There is a single line comment
多行注釋
=begin
There are comments.
There are comments.
There are comments.
There are comments.
=end
八、標(biāo)識(shí)符里的標(biāo)點(diǎn)符號(hào)
$var # 全局變量
@var # 實(shí)例變量,就是面向?qū)ο笾袑傩缘囊馑?/p>
@@var # 類變量,就是 Java 中靜態(tài)屬性的意思
empty? # 'empty?' 是方法的名字,如果以 ? 結(jié)尾,說(shuō)明這個(gè)方法返回值是布爾值
sort! # 'sort!' 是方法的名字,如果以 ! 結(jié)尾,說(shuō)明這個(gè)方法會(huì)改變對(duì)象本身,而不是返回一個(gè)被改變的 clone
九、迭代器
? 這里的迭代器其實(shí)不是一個(gè) Java 或者 cpp 中出現(xiàn)的跟指針一樣可以自增的東西,而是一個(gè)方法,這個(gè)方法接受一個(gè)代碼塊作為參數(shù)。這里利用了關(guān)鍵詞 yield 。示例如下,我模擬了一個(gè)數(shù)組,然后實(shí)現(xiàn)了它的迭代器方法 each
class MyArray
def initialize(a)
@a = a
end
def each
for i in 0...@a.size
yield @a[i]
end
end
end
a = [1, 2, 3]
my_a = MyArray.new(a)
my_a.each do |e|
puts e
end
? 可以看到,對(duì)于 each 方法,在實(shí)現(xiàn)中進(jìn)行了遍歷,但是并沒(méi)有說(shuō)明遍歷要干什么,只是有一個(gè)
yield @a[i]
? 對(duì)于這個(gè)情況, yield 會(huì)調(diào)用我們傳給他的代碼塊,也就是
do |e| puts e end
? 然后給形參 e 賦值 @a[i] ,然后對(duì)于數(shù)組中的每個(gè)元素有一個(gè) puts e 的操作,相當(dāng)于這個(gè)
for i in 0...@a.size
puts @a[i]
end
? 可以看到代碼塊的這種方式,大大拓展了原有函數(shù)的功能。
? 我們可以再看一個(gè)例子,這個(gè)例子不是類中的例子,而就是普通的一個(gè)方法,用于輸出一個(gè)等差數(shù)列。
def sequence(n, step, c)
(0..n).each do |i|
yield i * step + c
end
end
sequence(5, 3, 2) {|x| puts x}
柚子快報(bào)激活碼778899分享:博客 Ruby設(shè)計(jì)-基礎(chǔ)語(yǔ)法
精彩鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。