Ruby 中的各种稀奇古怪的关键字


layout: post
title: Ruby 中的各种稀奇古怪的关键字
category: posts


写在前面

Ruby 中有很多稀奇古怪的关键字,冷不丁的看到了一下还真不记得是个什么用法。这里就把我自己碰到的记录下来,方便下次查找 😜

1. _END_(END 两边分别有两个下划线)

如果一个文件包含这行代码,并且标记两边没有空白字符,Ruby 解释器会在此停止对该文件的处理。所以可以在该文件的余下部分可以包含任何内容(当然还是可以通过 IO 对象的 DATA 对其进行读取的)

# test.rb
def foo
  puts 'bar'
end
foo()
__END__
puts 'balabala...'

# ruby test.rb => bar

2. #coding: utf-8文件编码的指定

告诉 Ruby 解释器该文件的编码(或者在执行 .rb 文件的时候手动指定 ruby -E utf-8)

3. _ENCODING_

这个是一个常量,存储了当前文件的字符编码。

# gbk.rb
# coding: GBK
puts __ENCODING__

# ruby gbk.rb => GBK

4. 1_000_000_000 千分符

1_000_000_000: 千分符(等同于1000000000)

5. <<HEAR 自定义字符串分界符(需要结束)

自定义分界符内的全部作为字符串的内容

# 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 开始标示
# GROCERY_LIST 结束标示

6. `ls`

由`` 包裹住的会被传递给 Kernel.` 方法,会将文本当做一个操作系统的 shell 命令来执行(所以你也可以这样去调用 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、`` 方法的区别,直接上代码 😊:

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

*总结:
用system执行终端命令,命令会被执行,命令执行成功返回 true,命令执行失败返回 false,代码会继续往下执行。

2. exec
# test.rb
exec("echo 'hello'")
puts 'foobar'

# ruby test.rb => hello

总结:
后面的 puts 'foobar' 并没有被执行,以exec方法引导执行的程序启动的新进程会覆盖当前进程,而退出脚本。所以用exec可以执行终端命令,命令会被执行,命令执行成功后面的代码就不再继续执行了,命令执行失败,程序会报错。

3. ``
# test.rb
result = `echo 'hello'`
puts 'foobar'
puts result

# ruby test.rb => hello
foobar
hello

总结:
通过将系统 shell 包含在符号``之间, 命令执行成功返回执行结果( string 对象),命令执行失败程序会报错。

7. === 条件相等性操作符

条件相等性操作符,一般用在 case 语句的目标值是否和某个 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

所以可以重写该方法用来在 case 语句中决定两者是否匹配

8. =~ 正则匹配

这个是用来匹配正则表达式的

"aaa0" =~ /\d/  => 3 # 返回起始位置,未匹配上返回 nil

9. <=> 顺序比较

1 <=> 2  # => -1
1 <=> 1  # => 0
2 <=> 1  # => 1

10. _FILE_ (Ruby 解释器正在执行的文件名称)

# test.rb
puts __FILE__

# ruby test.rb  => test.rb

11. LINE (当前代码的行数(整数) 该代码属于 FILE 所代表的文件)

# test.rb
# 这里是一行注释
puts __LINE__

# ruby test.rb  => 2

12. ::ARGV (常量前面加上两个冒号)

表示在全局域内寻找 ARGV 这个常量等同于 Object::ARGV (因为不存在针对常量的 ‘全局作用域’,所以常量会被定义在 Object 里)。

PS: 另外在提一下变量和常量的一个小区别:

# 1. 变量: 当 Ruby 解释器看到对变量的赋值时,变量已经存在了
a = 1 if false
puts a  #=> nil
puts b #=> NameError!

# 2. 常量: 必须真正被赋值后常量才会存在
A = 1 if false
puts A  #=> NameError!

未完待续...😄

Kenyon

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,128评论 2 34
  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 99,119评论 9 467
  • 夜静悄悄的,我们今天晚上的晚自习考试了一门我们上过两次的课,随着我们交上试卷的那一刻我们便结课了,并为这门课画上了...
    看风吟唱阅读 118评论 1 3
  • 1、报名到开始上理论一般是1周左右,学员多就得多等几周。宁波统一是周五到周二上午,四天半的时间; 2.理论上课是四...
    33c7b7c68920阅读 753评论 0 0