您好我的问题是使用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
答案 0 :(得分:1)
1)在.inject之后传递0的参数是什么意思? 0?3的第一个指数点在范围内?
0
是初始累加器值。如果它不存在,则范围的第一个元素将作为累加器值传递,第二个元素作为索引传递,从而绕过块逻辑应用于第一个索引。
2)我看到count是累加器备忘录值,而索引是 索引点,但块是如何被利用和绑定的 下一行代码?
为该范围的每个元素执行块。我不知道你的意思是“下一行”。该块只有一个语句,该方法在块后立即终止。
3)为什么要使用三元运算符?
不确定你在问什么“为什么”。它完成了预期的逻辑。
答案 1 :(得分:0)
3)为什么要使用三元运算符?
如果您在RSpec书中开车过关,很容易忘记在任何给定点上发生的事情。
当我看到上面的回答,质疑你的问题,我的第一反应方式,"这是一个公平的问题,他们采取整数并将其视为一个布尔。"
在某些时候,我错过了我们停止推动整数并开始移动布尔的地方。
底线,正在使用三元运算符,因为它在这种情况下是有意义的。