如果使用,试图找到关于ruby尾随的文档

时间:2014-09-16 01:07:45

标签: ruby rspec

我正在使用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”的文档

显然我错过了一些基本的东西。

2 个答案:

答案 0 :(得分:2)

Ruby Post-Condition as Syntactic Sugar

在Ruby中,几乎所有内容都是表达式,ifunless等关键字可以用作跟随表达式的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