Ruby代码理解 - 来自代码学校

时间:2013-08-22 09:34:06

标签: ruby-on-rails ruby ruby-on-rails-3

) 我正在通过非常好的网站代码学习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))

3 个答案:

答案 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)返回与模式匹配的每个元素的数组。有关详细信息,请参阅grepRegexp.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)

vinodadhikary说了所有。我只是不喜欢OP提到的语法

search = "" unless search 

这个更好

search ||= ""