rubyonrails:ruby 一些简单的例子

现在我们将前面些举例代码坼开来分析下.
下面例子出现在简单例子节.
def fact(n)
n 0
1

n * fact(n-1)
end
end
pr fact(ARGV[0].to_i), "\n"

是第次解释,我们将逐行分析.
def fact(n)

行,def 用于定义(或者,更准确地说,个思路方法(method);我们会在稍后节中详细讨论什么是个思路方法).这里,它指明 fact 个参数,也就是 n.
n 0

用来检查个条件.当条件吻合时,执行下面代码;否则执行跟在代码.
1

当条件成立时 值为 1.


如果条件不成立,执行从这里到end代码.
n * fact(n-1)

如果条件不满足, 值会是n乘fact(n-1)结果.
end

个 end 和 语句对应.
end

第 2个 end 和 def 语句对应.
pr fact(ARGV[0].to_i), "\n"

这句用由命令行指定值来fact并打印结果.
ARGV是个包含命令行参数.ARGV成员是串,所以我们必须通过to_i转化其为整数. Ruby并不像Perl那样自动将串转化为整数.
Hmmm...如果向个负值作为参数会怎样?你看到这个问题了吗?你可以修复它吗?
Strings
下面我们来检查在串这章中出现猜谜.由于这个要长点,我们为每行打上行数.
01 words = ['foobar', 'baz', 'quux']
02 secret = words[rand(3)]
03
04 pr "guess? "
05 while guess = STDIN.gets
06 guess.chop!
07 guess secret
08 pr "you win\n"
09
10
11 pr "you lose.\n"
12 end
13 pr "guess? "
14 end
15 pr "the word is ", secret, ".\n"

这个里,我们使用了个新控制结构 while.只要某个指定条件保持为真,while和它对应end的间代码会重复执行.
行2rand(3)返回个介于0-2的间随机数.这个随机数用于提取 words 中个成员.
在行5我们通过STDIN.gets思路方法从标准输入读取行.如果读行遇到时 EOF (文件结束), gets会返回nil.因此,和while相连代码会直执行直到它遇到^D(或DOS下^Z),表示输入结束.
行6guess.chop!去掉 guess 最后;那定是个换行符.
行15,我们打印出要猜词.我们写代码是上向 pr 语句传递 3个参数(这 3个参数个接个地打印),但也可以用个参数等效地打印: 将secret写为 #{secret}以表明将它是个要取值变量,而非个要打印般文字:
pr "the word is #{secret}.\n"

正则表达式
最后我们来看看正则表达式那个.

01 st = "\033[7m"
02 en = "\033[m"
03
04 while TRUE
05 pr "str> "
06 STDOUT.flush
07 str = gets
08 not str
09 str.chop!
10 pr "pat> "
11 STDOUT.flush
12 re = gets
13 not re
14 re.chop!
15 str.gsub! re, "#{st}\\&#{en}"
16 pr str, "\n"
17 end
18 pr "\n"

在行4,while条件被硬设为 true,因此这好像构成了个无限循环.但我们在行8和行13放置了语句以跳出循环.这两个语句也是 修饰辞( modier)个例子.个"修饰辞"当且仅当指明条件满足时执行它左边语句.
再说说 chop! (出现在行9和行14).在Ruby里,我们亦可将"!"和"?"附于某些思路方法名字后面.惊叹号(!,有时大声地念作"bang!")暗示某些东西可能具破坏性(destructive),也就是指,某些东西可以改变它所触及东西. chop!直接作用于串,但不带!chop只会产生个拷贝.下面有这区别演示.
ruby> s1 = "forth"
"forth"
ruby> s1.chop! # This changes s1.
"fort"
ruby> s2 = s1.chop # This puts a changed copy in s2,
"for"
ruby> s1 # ... without disturbing s1.
"fort"

以后你还会遇见以问号(?,有时大声地念做 "huh?")结束思路方法名;这指"断言"(prediacte)思路方法,只会返回true或false.
行15应给予注意.首先,注意gsub!也是个破坏.它通过替换所有符合 re 模式来修改 str(sub指替换,首字母 g 指全局, 比如,替换所有匹配而不只是第个匹配).到此为止,还好;但我们用什么来替代文本中匹配部分呢? 在行1和行2里 st 和 en 被分别定义为表示反转文本颜色(color-inverted)和恢复正常文本颜色ANSI码. 在行15,它们被#{}括起以确保他们被前面定义那样解释(这样我们才没看见变量名被打印出来).在这中间是 "\\&".这是个小把戏.替换串是由双引号引起,对反斜杠会被解释为个单反斜杠;所以 gsub!实际上得到是"\&",就段特殊代码正好就是表示"任何和模式于第处匹配".因此新串在被打印出来时候,很像原来那个,只不过匹配部分以反视(inverse video)方式高亮度显示出来.
Tags:  ruby是什么 ruby教程 ruby是什么意思 rubyonrails

延伸阅读

最新评论

发表评论