我正在通过初学Ruby从新手到专业第2版,目前在第49页,我们正在学习RegEx基础知识。书中的每个RegEx代码段都有一个跟踪它的代码,但尚未解释。
{ |x| puts x }
在上下文中:
"This is a test".scan(/[a-m]/) { |x| puts x }
有人可以告诉我吗?
答案 0 :(得分:2)
scan
之类的方法是迭代器;在这种情况下,每次匹配传递的正则表达式时,scan
执行程序员指定的操作。在Ruby中,“something”表示为块,由{ code }
或do code end
(具有不同的优先级)表示,它作为特殊参数传递给方法。块可以以参数列表(和局部变量)开始,这是|x|
部分; scan
使用匹配的字符串调用块,该字符串绑定到块内的x
。 (此语法来自Smalltalk。)
因此,在这种情况下,scan
每次/[a-m]/
匹配时都会调用其阻止参数,这意味着a
和m
之间的字符串中的每个字符。< / p>
答案 1 :(得分:1)
它打印a
和m
之间字符串中的所有字母:http://ideone.com/lKaoI
|x| puts x
是一个annonymouse函数,(或者是“ruby中的”块“,据我所知,或者是其他语言中的lambda),它打印出它的参数。
有关详细信息,请参阅:
答案 2 :(得分:1)
在您的图书示例的上下文中,它包含在每个表达式之后,因为它只是表示“打印出每个匹配项。”
它是code block,它为正则表达式的每个匹配运行。
{ }
创建代码块。
|x|
为代码块
puts
打印出一个字符串,x
是它打印的字符串。
正则表达式匹配字符类[a-m]
中的任何单个字符。因此,有五种不同的匹配,并打印出来:
h
i
i
a
e
答案 3 :(得分:1)
输出
h
i
i
a
e
字符串“This is a test”的每个字符都是针对正则表达式[a-m]
进行检查的,这意味着“a..m
范围内只有一个字符,并且在其自己的行上打印(通过{ {1}})如果匹配。第一个字符puts
不匹配,第二个T
匹配,等等。最后一个字符是{{ 1}}在“测试”中。
答案 4 :(得分:0)
{ |x| puts x }
定义了一个新块,它接受一个名为x
的参数。调用块时,它会将其参数x
传递给puts
。
编写相同内容的另一种方法是:
"This is a test".scan(/[a-m]/) do |x|
puts x
end
每次正则表达式匹配字符串中的某些内容时,scan
函数都会调用该块,因此每个匹配都会打印出来。
这里有关于块的更多信息: http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_containers.html