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

时间:2010-01-09 01:41:27

标签: ruby

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

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

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

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

    define SayHi
      puts "Hello" 
    end
    SayHi 
    

    会产生错误:

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

    class Test
      def SayHi
        puts "hello" 
      end
    end
    t = Test.new
    t.SayHi    # => hello
    
  3. 有谁知道为什么#1在#2工作时不起作用? ruby方法名称的确切规则是什么?

2 个答案:

答案 0 :(得分:27)

按照惯例,以大写字母开头的东西是常量。当您调用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.

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

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

如果我们想要访问常量C,我们会使用范围限定符::

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

答案 1 :(得分:1)

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

良好的Ruby编码风格:

def method_name
end

# or

class CamelCase
  def method_name(parameter_name)
  end
end

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

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