【问题标题】:String#include? only checking first position字符串#包括?只检查第一个位置
【发布时间】:2013-01-13 09:44:45
【问题描述】:

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

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

【问题讨论】:

  • 你还能打印char_clicked variabale吗?
  • 试试char_clicked.strip(删除换行符和其他意外的前导和尾随空格)。
  • @steenslag 它不能解决问题
  • @tdgs puts char_clicked 打印任何被点击的字母,但它返回 false,除非它是单词中的第一个字母
  • 顺便说一句,该应用程序只是一个 enki 博客 github.com/xaviershay/enki/blob/master/Gemfile,我正在添加它,即没有很多源代码,而且我看不出 gem 作者有任何理由覆盖包含?

标签: ruby


【解决方案1】:

也许include? 在某处被覆盖(猴子补丁)。以下是否有效?

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

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

【讨论】:

  • 这是有效的,因为它告诉我字母是否包含在单词中。但是,如果我正在检查包含?相同应用程序的控制台中的方法并且它在那里工作正常,那么它不应该被覆盖,因为控制台使用相同的应用程序......如果在应用程序中覆盖了包含,那么它也将被覆盖我测试时的rails控制台
【解决方案2】:

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

final_word.upcase.include?(char_clicked)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    • 2015-09-28
    • 2017-03-26
    • 2022-06-26
    • 2013-03-08
    相关资源
    最近更新 更多