) 我正在通过非常好的网站代码学习ruby,但是在他们的一个例子中我不理解背后的方法和逻辑,有人可以解释一下吗?
非常感谢你; - )
这是代码
search = "" unless search
games = ["Super Mario Bros.", "Contra", "Metroid", "Mega Man 2"]
matched_games = games.grep(Regexp.new(search))
puts "Found the following games..."
matched_games.each do |game|
puts "- #{game}"
end
我真的不明白第1行和第3行
search = "" unless search
matched_games = games.grep(Regexp.new(search))
答案 0 :(得分:1)
如果未定义search
,则以下语句将空字符串分配给search
变量。
search = "" unless search
如果没有完成此分配,Regexp.new
会抛出TypeError
消息no implicit conversion of nil into String
,或者如果未定义搜索,则NameError
消息未定义本地变量或方法'搜索'......
在以下声明中:
matched_games = games.grep(Regexp.new(search))
games.grep(pattern)
返回与模式匹配的每个元素的数组。有关详细信息,请参阅grep。 Regexp.new(search)
从提供的search
变量构造一个新的正则表达式,该变量可以是字符串或正则表达式模式。同样,有关详细信息,请参阅Regexp::new
所以说例如搜索是""
(空字符串),然后Regexp.new(search)
返回//
,如果搜索='超级马里奥兄弟'然后Regexp.new(search)
返回/Super Mario Bros./
。
现在模式匹配:
# For search = "", or Regexp.new(search) = //
matched_games = games.grep(Regexp.new(search))
Result: matched_games = ["Super Mario Bros.", "Contra", "Metroid", "Mega Man 2"]
# For search = "Super Mario Bros.", or Regexp.new(search) = /Super Mario Bros./
matched_games = games.grep(Regexp.new(search))
Result: matched_games = ["Super Mario Bros."]
# For search = "something", or Regexp.new(search) = /something/
matched_games = games.grep(Regexp.new(search))
Result: matched_games = []
希望这是有道理的。
答案 1 :(得分:0)
搜索应该是 Regexp 或nil的实例。在第一行搜索设置为空字符串,如果它最初等于nil。
在第三个字符串中 matched_games 设置为与给定正则表达式匹配的字符串数组(http://ruby-doc.org/core-2.0/Enumerable.html#method-i-grep)
答案 2 :(得分:0)
search = "" unless search
这个更好
search ||= ""