我正在使用RSpec书籍(第121页),并且会看到一些明显不言而喻的代码。这对我来说并不明显,我希望有人能帮助我理解。
我要从c#来ruby,所以请用小词:)
这是原始代码
def total_match_count
count = 0
secret = @secret.split('')
@guess.split('').map do |n|
if secret.include?(n)
secret.delete_at(secret.index(n))
count += 1
end
end
count
end
这是重构
def total_match_count
secret = @secret.split('')
@guess.split('').inject(0) do |count, n|
count + (delete_first(secret, n) ? 1 : 0)
end
end
def delete_first(code, n)
code.delete_at(code.index(n)) if code.index(n)
end
同样,这应该是显而易见的,不需要评论。 我不理解尾随“if code.index(n)”位,我找不到任何关于使用关键字“ruby trailing if”的文档
显然我错过了一些基本的东西。
答案 0 :(得分:2)
在Ruby中,几乎所有内容都是表达式,if
和unless
等关键字可以用作跟随表达式的expression modifiers。有些语言将这些称为后置条件,但总体思路是:
if 1 == 1
puts true
end
旨在等同于:
puts true if 1 == 1
后置条件有时可以使代码的意图更清晰,或创建更自然的流程。解析器区分:if和:if_mod标记,内部表示“正常”if语句及其匹配的后置条件,但从程序员的角度来看,后置条件(或应该)主要是语法糖来制作某些表达式更容易或更清晰地阅读和书写。
你不会在Ruby中需要后置条件,但是你经常会在惯用的Ruby代码中找到它们。如果你没有理解它们,或者没有发现它们提高了代码的可读性,那么除非它们对你有用,否则可以随意忽略它们。
答案 1 :(得分:1)
此:
code.delete_at(code.index(n)) if code.index(n)
与此相同:
if code.index(n)
code.delete_at(code.index(n))
end
有些人认为单行更容易阅读。这是一种风格问题 - 当线条变长时,"尾随如果"可能是一个陷阱,因为你可能不会想到读到行的末尾以意识到它附有条件。谨慎使用。
Ruby也有unless
,可用于"尾随"形式也是:
do_stuff unless no_on_second_thought