0

我有一种方法可以检查一个单词是否包含某个字母。字符串#include? 如果字符串对象在任何位置包含字母,则方法应该返回 true。但是,我的方法只有在字母 (char_clicked) 和单词第一个位置的字母 (final_word) 匹配时才返回 true。例如,如果 final_word 参数是西班牙,则该方法仅在 "S" 是 char_clicked 时返回 true,如果 char_clicked 是 "_pain" 中的任何一个则返回 false

你能减轻我的痛苦并告诉我我做错了什么吗......

def correct_guess?(char_clicked, final_word)
      puts char_clicked, final_word      #p, Spain  
      puts final_word.is_a?(String)      #true
      puts "checking if string"
      puts final_word.include?(char_clicked)  #false
  final_word.include?(char_clicked)
end

更新

即使我将字符串转换为数组并检查字母,我也会得到相同的结果

puts final_word.split("").include?(char_clicked)

但是,如果我在该应用程序的控制台中使用包含,它工作正常

>> s = "brazil"
=> "brazil"
>> s.include?("z")
=> true

看到这个问题的第一个回答证实了包括?应该按照我上面展示的方式工作,我提供了更多信息,希望能解释为什么它不能像预期的那样工作

final_word 在发送到 correct_guess 之前被拉出会话?检查方法。char_clicked 被拉出参数

def check 
    final_word = session[:word]
    char_clicked = params[:char_clicked]
    correct_guess = Game.correct_guess?(char_clicked, final_word)
    ....

将 char_clicked 发送到上述检查方法的 Ajax 请求

$.ajax({
        url: "/check",
        type: "POST",
        data: {char_clicked: this.get("char_clicked")},
        success: function(response) {
          console.log(response);
          var json = $.parseJSON(response);

          if (response.incorrect_guesses >= _this.get("threshold")) _this.set({lost: true});
          if (response.win) _this.set({win: true});

          _this.trigger("guessCheckedEvent", response);
        }
      })
    },
4

2 回答 2

1

也许include?在某处被覆盖(monkeypatched)。下面的工作吗?

def correct_guess?(char_clicked, final_word)
  final_word =~ /#{char_clicked}/i
end

regex-matcher 方法也不太可能被覆盖。

于 2013-01-13T10:48:40.720 回答
1

这是一个高级问题。final_word 始终是一个专有名称,“巴西”,只有第一个字母大写。但是,char_clicked 始终是大写的。方法的相等匹配include?仅在有大小写匹配时才返回 true。如果我在检查它是否包含 char_clicked 之前更改了使 final_word 大写的方法,它会返回预期的 true 或 false

final_word.upcase.include?(char_clicked)
于 2013-01-13T18:39:37.987 回答