字符串#包括哪些内容?只检查第一个位置

时间:2013-01-13 09:44:46

标签: ruby

我有一种检查单词是否包含某个字母的方法。字符串#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)

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

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

看到对这个问题的第一反应证实包括?应该按照我上面展示的方式工作,我提供的更多信息可能有助于解释为什么它不像人们期望的那样工作

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

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

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

$.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);
        }
      })
    },

2 个答案:

答案 0 :(得分:1)

也许include?在某处被覆盖(monkeypatched)。以下是否有效?

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

也不太可能覆盖正则表达式匹配方法。

答案 1 :(得分:1)

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

final_word.upcase.include?(char_clicked)