注入方法用于Rspec书籍,上下文:Codebreaker游戏

时间:2013-12-11 18:51:49

标签: ruby rspec

您好我的问题是使用RSpec书中使用的注入方法和codebreaker游戏。我无法阅读和理解它在做什么。我已经阅读了该方法的解释; http://ruby-doc.org/core-2.0.0/Enumerable.html#method-i-inject,但目前尚不清楚。有人可以启发一个新手吗?

1)在.inject之后传递0的参数是什么意思?范围内的0..3的第一个指数点?
2)我看到count是累加器备忘录值,该索引是索引点,但是如何使用块并将其绑定到下一行代码中?

3)为什么要使用三元运算符?

问题的代码:

def exact_match_count(guess)
  (0..3).inject(0) do |count, index|
    count + (exact_match?(guess, index) ? 1 : 0)
  en
end

def number_match_count(guess)
  (0..3).inject(0) do |count, index|
    count + (number_match?(guess, index) ? 1 : 0)
  end
end

我相信它与这个例子并行,但是没有看到它。

# find the longest word
longest = %w{ cat sheep bear }.inject do |memo, word|
  memo.length > word.length ? memo : word
end

longest                                        #=> "sheep"

更大背景的完整代码:

module Codebreaker
  class Game

def initialize(output)
  @output = output
end

def start(secret)
  @secret = secret
  @output.puts 'Welcome to Codebreaker!'
  @output.puts 'Enter guess:'
end

def guess(guess)
  @output.puts '+' *exact_match_count(guess) + '-'*number_match_count(guess)
end

def exact_match?(guess, index)
  guess[index] == @secret[index]
end

def number_match?(guess, index)
  @secret.include?(guess[index]) && !exact_match?(guess, index)
end

def exact_match_count(guess)
  (0..3).inject(0) do |count, index|
    count + (exact_match?(guess, index) ? 1 : 0)
  end
end

def number_match_count(guess)
  (0..3).inject(0) do |count, index|
    count + (number_match?(guess, index) ? 1 : 0)
  end
end

  end
end

2 个答案:

答案 0 :(得分:1)

  

1)在.inject之后传递0的参数是什么意思?   0?3的第一个指数点在范围内?

0是初始累加器值。如果它不存在,则范围的第一个元素将作为累加器值传递,第二个元素作为索引传递,从而绕过块逻辑应用于第一个索引。

  

2)我看到count是累加器备忘录值,而索引是   索引点,但块是如何被利用和绑定的   下一行代码?

为该范围的每个元素执行块。我不知道你的意思是“下一行”。该块只有一个语句,该方法在块后立即终止。

  

3)为什么要使用三元运算符?

不确定你在问什么“为什么”。它完成了预期的逻辑。

答案 1 :(得分:0)

  

3)为什么要使用三元运算符?

如果您在RSpec书中开车过关,很容易忘记在任何给定点上发生的事情。

当我看到上面的回答,质疑你的问题,我的第一反应方式,"这是一个公平的问题,他们采取整数并将其视为一个布尔。"

在某些时候,我错过了我们停止推动整数并开始移动布尔的地方。

底线,正在使用三元运算符,因为它在这种情况下是有意义的。