未定义方法 `exists?' 于 File:Class (NoMethodError)。

16
   3.2.0 :002 > File.exists?("xyz")
(irb):2:in `<main>': undefined method `exists?' for File:Class (NoMethodError)
Did you mean?  exist?                             
        from /Users/jason/.rvm/rubies/ruby-3.2.0/lib/ruby/gems/3.2.0/gems/irb-1.6.2/exe/irb:11:in `<top (required)>'
        from /Users/jason/.rvm/rubies/ruby-3.2.0/bin/irb:25:in `load'
        from /Users/jason/.rvm/rubies/ruby-3.2.0/bin/irb:25:in `<main>'

请不要忘记“接受”他的答案。这会增加人们在未来提供帮助的机会。 - vlasits
2个回答

45
从Ruby 3.2.0开始,似乎已经移除了exists?(复数形式)对exist?的别名。
在Ruby 3.2.0中,请确保使用单数形式的exist?。
% rvm use 3.1.3
Using /Users/jason/.rvm/gems/ruby-3.1.3
jason@MBA22.local /Users/jason/Work/Hot_Glue/Example Apps/AltLookup1 [main]
% irb  
3.1.3 :001 > File.exist?("xyz")
 => false 
3.1.3 :002 > File.exists?("xyz")
 => false 
3.1.3 :003 > exit
jason@MBA22.local /Users/jason/Work/Hot_Glue/Example Apps/AltLookup1 [main]
% rvm use 3.2.0
Using /Users/jason/.rvm/gems/ruby-3.2.0
jason@MBA22.local /Users/jason/Work/Hot_Glue/Example Apps/AltLookup1 [main]
% irb
3.2.0 :001 > File.exist?("xyz")
 => false 
3.2.0 :002 > File.exists?("xyz")
(irb):2:in `<main>': undefined method `exists?' for File:Class (NoMethodError)
Did you mean?  exist?                             
        from /Users/jason/.rvm/rubies/ruby-3.2.0/lib/ruby/gems/3.2.0/gems/irb-1.6.2/exe/irb:11:in `<top (required)>'
        from /Users/jason/.rvm/rubies/ruby-3.2.0/bin/irb:25:in `load'
        from /Users/jason/.rvm/rubies/ruby-3.2.0/bin/irb:25:in `<main>'


4
Ruby的作者是否破坏了其他无辜和标准的事情? - Gibezynu Nu
5
File.exists?自Ruby 2.1版本起就已被弃用,但在此之后的几年中仍保留在语言中。您可以在发行说明中找到所有已删除功能 https://www.ruby-lang.org/en/news/2022/12/25/ruby-3-2-0-released/ ,向下滚动到“已删除常量”和“已删除方法”。 - Jason FB
哇,开发者们的决定真是令人困惑。我明白他们想统一函数名称,但他们本可以将其保留为废弃的别名以保持向后兼容性。这样的改动绝对不值得引发如此大的变动。 - undefined

10
您忘记在结尾处添加问号(?)了:
File.exist? 'foo'
File.exists? 'foo'

通常,回答问题的方法总是以问号结束。

在这种情况下,该方法正在询问 文件 是否存在名称为 'foo' 的东西。该类将返回答案。


哈哈!我以为那是文档中的某种注释。谢谢! - Klortho
@Klortho,方法名称的末尾也可以有= - Matheus Moreira
1
还有一点需要注意的是,没有权威机构强制使用 ?/!/=,它只是一种有用的约定。 - Josh
1
我认为结尾的 ? 是提醒该方法返回一个布尔值 true/false。这意味着因为英语中的标点符号,有一个问题被问到,但是该方法应该返回一个布尔值。 - the Tin Man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接