layout: post
title: Ruby 中的各種稀奇古怪的關(guān)鍵字
category: posts
寫在前面
Ruby 中有很多稀奇古怪的關(guān)鍵字,冷不丁的看到了一下還真不記得是個(gè)什么用法。這里就把我自己碰到的記錄下來(lái),方便下次查找 ??
1. _END_(END 兩邊分別有兩個(gè)下劃線)
如果一個(gè)文件包含這行代碼,并且標(biāo)記兩邊沒有空白字符,Ruby 解釋器會(huì)在此停止對(duì)該文件的處理。所以可以在該文件的余下部分可以包含任何內(nèi)容(當(dāng)然還是可以通過(guò) IO 對(duì)象的 DATA 對(duì)其進(jìn)行讀取的)
# test.rb
def foo
puts 'bar'
end
foo()
__END__
puts 'balabala...'
# ruby test.rb => bar
2. #coding: utf-8文件編碼的指定
告訴 Ruby 解釋器該文件的編碼(或者在執(zhí)行 .rb 文件的時(shí)候手動(dòng)指定 ruby -E utf-8)
3. _ENCODING_
這個(gè)是一個(gè)常量,存儲(chǔ)了當(dāng)前文件的字符編碼。
# gbk.rb
# coding: GBK
puts __ENCODING__
# ruby gbk.rb => GBK
4. 1_000_000_000 千分符
1_000_000_000: 千分符(等同于1000000000)
5. <<HEAR 自定義字符串分界符(需要結(jié)束)
自定義分界符內(nèi)的全部作為字符串的內(nèi)容
# test.rb
puts <<GROCERY_LIST
1. Salad mix.
2. Strawberries.*
def foo
puts '這里是里面'
end
foo()
GROCERY_LIST
def foo2
puts '這里是外面'
end
foo2()
# ruby test.rb =>
1. Salad mix.
2. Strawberries.*
def foo
puts '這里是里面'
end
foo()
這里是外面
# 備注
# GROCERY_LIST 開始標(biāo)示
# GROCERY_LIST 結(jié)束標(biāo)示
6. `ls`
由`` 包裹住的會(huì)被傳遞給 Kernel.` 方法,會(huì)將文本當(dāng)做一個(gè)操作系統(tǒng)的 shell 命令來(lái)執(zhí)行(所以你也可以這樣去調(diào)用 Kernel.`(......),效果相同),或者使用 system('ls') 也是可以的
# irb
`ls` # => "rubyconf.txt\ntest.rb\n"
Kernel.`'ls' # => "rubyconf.txt\ntest.rb\n"
system('ls') # => rubyconf.txt test.rb
=> true
這里捎帶提一下 system、exec、`` 方法的區(qū)別,直接上代碼 ??:
1. system
# test.rb
result = system("echo 'hello'")
puts 'foobar'
puts result
# ruby test.rb =>
hello
foobar
true
########## 這里是分割線 ############
# test2.rb
result = system("echo0 'hello'")
puts 'foobar'
puts result
# ruby test2.rb =>
sh: echo0: command not found
foobar
false
*總結(jié):
用system執(zhí)行終端命令,命令會(huì)被執(zhí)行,命令執(zhí)行成功返回 true,命令執(zhí)行失敗返回 false,代碼會(huì)繼續(xù)往下執(zhí)行。
2. exec
# test.rb
exec("echo 'hello'")
puts 'foobar'
# ruby test.rb => hello
總結(jié):
后面的 puts 'foobar' 并沒有被執(zhí)行,以exec方法引導(dǎo)執(zhí)行的程序啟動(dòng)的新進(jìn)程會(huì)覆蓋當(dāng)前進(jìn)程,而退出腳本。所以用exec可以執(zhí)行終端命令,命令會(huì)被執(zhí)行,命令執(zhí)行成功后面的代碼就不再繼續(xù)執(zhí)行了,命令執(zhí)行失敗,程序會(huì)報(bào)錯(cuò)。
3. ``
# test.rb
result = `echo 'hello'`
puts 'foobar'
puts result
# ruby test.rb => hello
foobar
hello
總結(jié):
通過(guò)將系統(tǒng) shell 包含在符號(hào)``之間, 命令執(zhí)行成功返回執(zhí)行結(jié)果( string 對(duì)象),命令執(zhí)行失敗程序會(huì)報(bào)錯(cuò)。
7. === 條件相等性操作符
條件相等性操作符,一般用在 case 語(yǔ)句的目標(biāo)值是否和某個(gè) when 從句相匹配
case some_object
when /a regex/
# do something
when String
# do something
when 2..4
# do something
end
# 等同
if /a regex/ === some_object
# do something
elsif String === some_object
# do something
elsif (2..4) === some_object
# do something
end
# 所以
# irb
Integer === 1 # => true
(1..5) === 5 # => true
所以可以重寫該方法用來(lái)在 case 語(yǔ)句中決定兩者是否匹配
8. =~ 正則匹配
這個(gè)是用來(lái)匹配正則表達(dá)式的
"aaa0" =~ /\d/ => 3 # 返回起始位置,未匹配上返回 nil
9. <=> 順序比較
1 <=> 2 # => -1
1 <=> 1 # => 0
2 <=> 1 # => 1
10. _FILE_ (Ruby 解釋器正在執(zhí)行的文件名稱)
# test.rb
puts __FILE__
# ruby test.rb => test.rb
11. LINE (當(dāng)前代碼的行數(shù)(整數(shù)) 該代碼屬于 FILE 所代表的文件)
# test.rb
# 這里是一行注釋
puts __LINE__
# ruby test.rb => 2
12. ::ARGV (常量前面加上兩個(gè)冒號(hào))
表示在全局域內(nèi)尋找 ARGV 這個(gè)常量等同于 Object::ARGV (因?yàn)椴淮嬖卺槍?duì)常量的 ‘全局作用域’,所以常量會(huì)被定義在 Object 里)。
PS: 另外在提一下變量和常量的一個(gè)小區(qū)別:
# 1. 變量: 當(dāng) Ruby 解釋器看到對(duì)變量的賦值時(shí),變量已經(jīng)存在了
a = 1 if false
puts a #=> nil
puts b #=> NameError!
# 2. 常量: 必須真正被賦值后常量才會(huì)存在
A = 1 if false
puts A #=> NameError!
未完待續(xù)...??
Kenyon