【问题标题】:.include? is not triggered when reading a txt file。包括?读取txt文件时不触发
【发布时间】:2019-06-07 19:01:30
【问题描述】:

我的印象是以下代码应该返回搜索项word 或消息no match - 如三元运算符所示。我无法诊断在哪里/为什么包括?方法不行。

class Foo

def initialize(word)
    @word=word
end

def file_open
    IO.foreach('some_file.txt') do |line|
        line.include?(@word) ? "#{@word}" : "no match"
    end
end

end

print "search for: "
input = gets.chomp.downcase

x = Foo.new(input)
puts x.file_open

input 存在于some_file.txt 中。我的三元运算符语法也是正确的。 IO 可以很好地读取文本(我也尝试过 File.open() 并遇到了同样的问题)。所以我的include? 方法一定是错误的。

【问题讨论】:

  • 您在使用a+ 模式和foreach 时?同样open_file 将在你的循环中返回最后一次调用.includs? 的结果。
  • “不工作”不是一个足够精确的错误描述,我们无法帮助您。 什么不起作用? 如何不起作用?你的代码有什么问题?您收到错误消息吗?错误信息是什么?你得到的结果不是你期望的结果吗?你期望什么结果,为什么,你得到的结果是什么,两者有什么不同?您正在观察的行为不是期望的行为吗?期望的行为是什么,为什么,观察到的行为是什么,它们有何不同?
  • a+ 已修改。 file_open 正在返回空白;它应该返回wordno match
  • @JörgWMittag 我很抱歉。 file_open 应该返回 1. 文本文件中的行匹配搜索项 word 或 2. no match 如果 word 不包含在任何地方。现在file_open 只返回空白。
  • 是的,IO::foreach 总是返回nil,文档清楚地说明了这一点。但是,你问的是String#include?,你有什么问题?

标签: ruby search ternary-operator


【解决方案1】:

您需要控制返回值。上面定义的file_open 将始终返回nil。三元组将被正确执行,但它的值没有做任何事情。相反,您可以执行以下操作:

class Foo
  def initialize(word)
    @word=word
  end

  def file_open
    IO.foreach('some_file.txt') do |line|
        return line if line.include?(@word)
    end
    return "no match"
  end
end

【讨论】:

  • 也许你可以澄清一下。奇怪的是,我最初学习了三元运算符 def a(b);b=="b" ? "foo" : "bar";end;puts a("b") => foo 没有明确的 return。你能解释一下为什么需要明确的return 吗?
  • 您的 a 方法确实返回了三元运算符的结果。不过,您的问题是一个不同的用例,三元运算符处于循环中。因此,即使它被评估为“不匹配”,结果也会被丢弃,因为程序将继续前进到下一行,直到文件末尾,此时我们将返回 nil,返回值通过IO.foreach。为了突破IO.foreach,我们使用了所谓的提前返回语句。如果我们发现第 N 行匹配,则无需检查第 N+1 行。另请注意,"no match" 之前的最后一个return 是多余的
猜你喜欢
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
相关资源
最近更新 更多