gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 06:35:33 25 4
gpt4 key购买 nike

我是一名 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

有谁知道为什么#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 的常量,我们使用范围限定符 :::

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

关于ruby - ruby 方法名的大小写规则是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2031980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com