Ruby 中的各種稀奇古怪的關(guān)鍵字


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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評(píng)論 19 139
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯(cuò)誤還是無(wú)法避免 以后資料會(huì)慢慢更新 大...
    數(shù)據(jù)革命閱讀 13,235評(píng)論 2 33
  • Ubuntu的發(fā)音 Ubuntu,源于非洲祖魯人和科薩人的語(yǔ)言,發(fā)作 oo-boon-too 的音。了解發(fā)音是有意...
    螢火蟲de夢(mèng)閱讀 100,671評(píng)論 9 468
  • 夜靜悄悄的,我們今天晚上的晚自習(xí)考試了一門我們上過(guò)兩次的課,隨著我們交上試卷的那一刻我們便結(jié)課了,并為這門課畫上了...
    看風(fēng)吟唱閱讀 134評(píng)論 1 3
  • 1、報(bào)名到開始上理論一般是1周左右,學(xué)員多就得多等幾周。寧波統(tǒng)一是周五到周二上午,四天半的時(shí)間; 2.理論上課是四...
    33c7b7c68920閱讀 840評(píng)論 0 0

友情鏈接更多精彩內(nèi)容