ruby方法名称的大写和小写规则是什么?

我是Ruby初学者。 从本书中,我知道Ruby方法名称应该以小写字母或下划线开头。 但我发现了不同的场景:

  1. 如果在类外定义了一个方法,它只能以小写字母开头,如果你试图定义一个以大写字母开头的方法,Ruby会抱怨错误,例如:

    define sayHi puts "Hello" end sayHi # => Hello 

    但是,以下代码不起作用:

     define SayHi puts "Hello" end SayHi 

    它会产生错误:

     :in `': uninitialized constant SayHi (NameError) 
  2. 如果在类中定义了一个方法,那么它可以以大写字母开头:

     class Test def SayHi puts "hello" end end t = Test.new t.SayHi # => hello 

有谁知道为什么#1在#2工作时不起作用? ruby方法名称的确切规则是什么?

按照惯例,以大写字母开头的东西是常量 。 当您调用SayHi ,您告诉Ruby 使用此名称查找常量 。 当然,没有一个,所以它失败了。

如果要调用该方法,则需要添加一对括号。 例如,

 def S puts "shazam!" end S #=> NameError: uninitialized constant S S() #=> "shazam!" 

在课堂内部,分辨率规则略有不同。 让我们定义一个带有常量的简单类和一个看起来像常量的方法:

 irb(main):001:0> class C irb(main):002:1> A = "x" irb(main):003:1> def B irb(main):004:2> puts "B() invoked" irb(main):005:2> end irb(main):006:1> end => nil 

现在, A肯定是一个常数。 但是B怎么样?

 irb(main):008:0> C.const_defined?("A") => true # A is a constant! irb(main):009:0> C.const_defined?("B") => false # B looks like a constant but isn't, because we # used "def" to create it. "def" is for methods, # not constants. 

所以它不是一个常数,只是一个具有该名称的方法。 当我们尝试从C的实例访问B ,现在Ruby正在寻找一个方法:

 irb(main):011:0> C.new.B B() invoked => nil 

如果我们想要访问C的常量,我们使用scope qualifier ::

 irb(main):012:0> C::A => "x" 

不要做任何你想做的事情。 这是糟糕的编码风格。

好的Ruby编码风格:

 def method_name end # or class CamelCase def method_name(parameter_name) end end 

几乎任何其他事情都是错误的。 语言可能会让你做其他的事情,但这并不意味着你应该。

此外,通常您不希望在类或模块之外定义方法 – 这在短暂抛弃脚本中是可接受的,但在实质项目中则不然。