我所不知道的Ruby语法【糖?】

最近在读【IronRuby Unleashed Feb.2010】的基本语法部分,发现书中有很多地方都出现了“USE A DIFFERENT ...”的表述。

的确,Ruby里的很多基本操作都提供了很多种方式/别名,很多猎奇的语法(糖)。这样可以让语言的实现更加多样化(多范式?),更加友好。不过很多时候也可以写出更加诡异的代码……


note:wiki了一下,Ruby应该是最像python, 都是【命令式|面向对象|反射|函数】语言。看来得加紧看看python了……

以下的基本例子选自书中,note中的例子都经过了测试。


1. 数字常量+下划线

大数字常量可以用下划线分割开,便于阅读。像这个样子……
num1 = 1000000000 # A billion
num2 = 1_000_000_000 # A billion. Equivalent to the previous line
note: 其实不一定要三位分割。你还可以
p 1_0000_0000
p 1_12_123_1234_12345
不过数字之间只能加一个下划线。

2.字符串字面量

这个很常用了。不过既然没用过,还是记一下吧。
关于单双引号字符串的区别。双引号字符串会处理转义字符和#{expr}的表达式(称为expression interpolation的)。而单引号字符串只处理\'和\\
my_string = “Hello there”
# 多行字符串
my_string = “Hello
there!
This is a three line string.”

# 单引号字符串:see below
my_string = ‘A \’single-quoted string\’’ # = A ‘single-quoted string’

# %q和%Q:%q生成单引号字符串;%Q生成双引号字符串
my_string = %q^I’ve seen enough of the chef’s food!^

# Heredoc(这个叫什么?)
my_string = <<DOC
Hello there! # This is part of the text... Can’t put comments inside heredocs
This is the second line.
DOC

my_string = <<’END OF MY STRING’
I’m writing here whatever I want.
Yes, everything goes!
Hallelujah!
END OF MY STRING

3. 自带鬼畜的printf-多次使用同一参数


C的printf似乎不能够多次使用同一参数。不过 Unix98的文档   Open-group printf 这里的规则是有%n$这样的语法的。Boost.format库就是支持这样的语法

# Use the same value multiple times
printf(“%1$s %2$s, %2$s %1$s, %2$s %2$s %2$s”, “hello”, “Ruby!”)
# = “hello Ruby!, Ruby! hello, Ruby! Ruby! Ruby!”

4. sprintf和python-style的字符串赋值

str = sprintf(“%-10s”, “IronRuby”)
str = “%-10s” % “IronRuby”

str = “%s %s !!!” % [“IronRuby”, “Unleashed”]
# str now equals “IronRuby Unleashed !!!”

5. 数组赋值

%w/%W定义的字符串数组

my_array = %w-A B C 5-
# Same as [‘A’, ‘B’, ‘C’, ‘5’]

my_array = %W~”Iron Ruby” V1~
# Same as [“\”Iron”, “Ruby\””, “V1”]

多个值变成一个值= =
my_array=[1,2,3,4,5]
my_array[1, 2]="haha"
# 此时my_array==[1, "haha", 4, 5]

my_array[1..2]=[]
# 此时my_array==[1, 5]

6. 诡异的range

range可以用a..b和a...b来表示(也就是中间2个点/3个点)但是……
1..5  = [1, 5]闭区间
1...5 = [1, 5) 不包括5

“AAA”..”BBB” # all possible combinations between “AAA” and “BBB”
# “AAA”, “AAB”, ..., “ABA”, “ABB”, ..., “ART”, “ARU”, ..., “BAZ”, “BBA”, “BBB”

7. 比较相关: equal? eql? ==, ===

<=>:3出口的比较。返回-1,0或者1
关系运算优先级:&& > || > and = or

==: 判断值相等。可以重载。例如: 17==17.0  ---> true
eql?: 判断(== 且 类型相同),可以重载。例如:17.eql?(17.0) --> false
equal? 判断(是同一个对象,object_id相同),不应该重载(其实还是可以重载)。

===:在Object的定义中,类似于instanceof。IR Unleashed中的描述是
Case equality. Mostly used implicitly in case statements. It has different implementa
tions. For example, for ranges it checks for membership, and for regular expressions
it tries to pattern match.
例如:
(1...10) === 5 returns true。这里实际上是(1...10.member?(5))

晕倒。。。。。。

……

99. misc


取字符的ascii:前面加'?'
num = ?A

正则表达式:string =~ regex 匹配。结果的MatchData对象存放在$~变量中
另外还有$&是匹配的字符串,$`是前面的部分,$'是后面的部分……
@pochioly
irb(main):015:0> "Hello 123 world" =~ /\d(\d*)/
=> 6
irb(main):016:0> $1
=> "23"
命名分组
irb(main):019:0> "Hello 123 world" =~ /\d(?<abc>\d*)/
=> 6
irb(main):020:0> $~["abc"]
=> "23"




别点!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值