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

Ste*_*ang 16 ruby

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

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

    define sayHi
      puts "Hello" 
    end
    sayHi   # => Hello
    
    Run Code Online (Sandbox Code Playgroud)

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

    define SayHi
      puts "Hello" 
    end
    SayHi 
    
    Run Code Online (Sandbox Code Playgroud)

    它会产生错误:

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

    class Test
      def SayHi
        puts "hello" 
      end
    end
    t = Test.new
    t.SayHi    # => hello
    
    Run Code Online (Sandbox Code Playgroud)

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

Joh*_*lla 27

按照惯例,以大写字母开头的东西是常量.当你调用时SayHi,你告诉Ruby 要用这个名字寻找一个常量.当然,没有一个,所以它失败了.

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

def S
  puts "shazam!"
end

S    #=> NameError: uninitialized constant S
S()  #=> "shazam!"
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

现在,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.
Run Code Online (Sandbox Code Playgroud)

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

irb(main):011:0> C.new.B
B() invoked
=> nil
Run Code Online (Sandbox Code Playgroud)

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

irb(main):012:0> C::A
=> "x"
Run Code Online (Sandbox Code Playgroud)