这个Ruby/RegEx代码做什么?

这个Ruby/RegEx代码做什么?,ruby,regex,Ruby,Regex,我正在经历从新手开始的Ruby到专业的第二版,目前在第49页,我们正在学习RegEx的基础知识。书中的每一个正则表达式片段都有一个未解释的代码 { |x| puts x } 在这方面: "This is a test".scan(/[a-m]/) { |x| puts x } 有人能给我一些提示吗?它打印a和m之间字符串中的所有字母: |x | puts x是一个annonymouse函数(据我所知,在ruby中是“块”,在其他语言中是lambda),用于打印其参数。 有关这方面的更多信息,

我正在经历从新手开始的Ruby到专业的第二版,目前在第49页,我们正在学习RegEx的基础知识。书中的每一个正则表达式片段都有一个未解释的代码

{ |x| puts x }
在这方面:

"This is a test".scan(/[a-m]/) { |x| puts x }

有人能给我一些提示吗?

它打印
a
m
之间字符串中的所有字母:

|x | puts x
是一个annonymouse函数(据我所知,在ruby中是“块”,在其他语言中是lambda),用于打印其参数。
有关这方面的更多信息,请参见:


{| x | put x}
定义了一个新块,该块使用名为
x
的单个参数。调用块时,它将其参数
x
传递给
put

写同样东西的另一种方法是:

"This is a test".scan(/[a-m]/) do |x|
  puts x
end
每次正则表达式与字符串中的内容匹配时,
scan
函数都会调用该块,因此每次匹配都会被打印出来

此处有有关块的更多信息:
scan
这样的方法是迭代器;在这种情况下,每次匹配传递的正则表达式时,
scan
执行程序员指定的操作。在Ruby中,“something”表示为一个块,由
{code}
do code end
表示(具有不同的优先级),它作为一个特殊参数传递给方法。块可以从参数列表(和局部变量)开始,这是
|x |
部分
scan
使用匹配的字符串调用块,该字符串绑定到块内的
x
。(此语法来自Smalltalk。)


因此,在这种情况下,
scan
将在每次
/[a-m]/
匹配时调用其块参数,这意味着在
a
m
之间的字符串中的每个字符上,在您的书的示例上下文中,它包含在每个表达式之后,因为它只是意味着“打印每个匹配。

它是一个,为正则表达式的每个匹配项运行

{}
创建代码块

|x |
为代码块创建参数

put
打印一个字符串,
x
是它打印的字符串

正则表达式匹配字符类
[a-m]
中的任何单个字符。因此,有五种不同的匹配,并打印出来:

h
i
i
a
e
输出是

h
i
i
a
e

字符串“This is a test”(这是一个测试)的每个字符都会根据正则表达式
[a-m]
进行检查,正则表达式的意思是“范围
a..m
中只有一个字符”,并打印在自己的行上(通过
puts
)如果匹配。第一个字符
T
不匹配,第二个
h
匹配,等等。最后一个匹配的是“test”中的
e

我想他在问什么
{x |放x}
是的。我不知道Ruby,但我只能假设它打印出正则表达式。@Switz-我刚开始,花了很长时间才弄清楚它在Ruby中是如何调用的,并找到了一些相关的引用。@Kobi你应该编辑你的答案,说“它打印给定字符串中a和m之间的所有字母或类似的内容。”。阅读当前答案的一种方法是打印
abcdefghijklm
。只是说“:-)谢谢geekosaur,点击这里!我还得再读几遍。