为什么在类名和文件名不匹配的实例中,Ruby不会抛出错误?

时间:2019-06-04 01:07:44

标签: ruby-on-rails ruby autoload

为什么在此实例中Ruby解释器不抛出NameError?

class OrangeTurtle
   self.table_name = 'turtles'
end

文件名:orange_turtles.rb

2 个答案:

答案 0 :(得分:0)

这个答案听起来像个警察,但不会引发错误,因为Ruby甚至都不关心文件名是什么。

例如在文件asdfasdf.no_rb_ending_here中我们可以拥有

#!/usr/bin/env ruby
module Something
  class Test
    def test
      puts 'test'
    end
  end
end
class SomethingElse
  def otherThings
    puts 'haha'
  end
end

然后让事情变得更奇怪,我可以有一个单独的文件来修改(猴子补丁)该文件中定义的类。 在more_stuff.rb

#!/usr/bin/env ruby
require_relative 'asdfasdf.no_rb_ending_here'
module Something
  class Test
    def test2
      test()
      puts '2'
    end
  end
end
class SomethingElse
  def moreThings
    otherThings()
    puts 'MOAR'
  end
end

Something::Test.new.test2()
# test
# 2
SomethingElse.new.moreThings()
# haha
# MOAR

Ruby非常酷-不需要引起错误的内容不会出错。

答案 1 :(得分:0)

名称错误或未初始化的常量错误仅出现在Rails中。这样做的原因是,活动记录(这也是一种通用设计模式)正在将数据库中的表与模型(或通常与对象)进行映射。 Active Record只能通过文件和类的命名约定建立该连接。 如另一个答案中所述,纯红宝石不需要遵守这些约定。但是,通常将文件命名为文件所包含的类,以具有更好的组织代码。