ruby方法名的大小写规则是什么?
我是红宝石初学者。从这本书中,我知道Ruby方法名应该以小写字母或下划线开头。但我发现了不同的情况:ruby方法名的大小写规则是什么?,ruby,Ruby,我是红宝石初学者。从这本书中,我知道Ruby方法名应该以小写字母或下划线开头。但我发现了不同的情况: 如果一个方法是在类之外定义的,那么它只能以小写字母开头,如果您试图定义一个以大写字母开头的方法,Ruby会抱怨一个错误,例如: define sayHi puts "Hello" end sayHi # => Hello 但是,以下代码不起作用: define SayHi puts "Hello" end SayHi 它将产生一个错误: :in `<main&g
define sayHi
puts "Hello"
end
sayHi # => Hello
但是,以下代码不起作用:
define SayHi
puts "Hello"
end
SayHi
它将产生一个错误:
:in `<main>': uninitialized constant SayHi (NameError)
有人知道为什么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编码风格:
def method_name
end
# or
class CamelCase
def method_name(parameter_name)
end
end
几乎其他任何事情都是错误的。语言可能会让你做其他事情,但这并不意味着你应该这样做
另外,一般来说,您不希望在类或模块之外定义方法——这在简短的一次性脚本中是可以接受的,但在实质性的项目中则不行。对于ruby来说是相当新的,这对我也很有帮助。解释得很好+1“按惯例”,不,按规则,因为Ruby强制执行它。可能将“类外”修改为“类或模块外”?在一个类中并不是所有的东西都有意义-有时你有一堆方法可以组合在一起,但你没有理由为这些方法创建实例。实际上,以大写字母开头的方法非常常见,甚至是核心库和标准库的一部分,例如
数组方法,哈希,核心库中的整数
,浮点
,字符串
,以及委托
库中的委托类
。这根本不是“糟糕的编码风格”,实际上恰恰相反。实际上,这是定义返回Class
es或Module
s的方法的正确方法,然后这些方法将被指定为包含d、extend
ed或继承自。确实如此,但我们要明确的是,这些不是常见的用例。这是一个新手,他不会很快编写返回类或模块的方法。虽然我已经使用了其中的一些,但我认为我还没有找到一个好的理由自己写一个。嗨,亚当先生,这是真的,我是Ruby的新手,我已经知道这不是一个好的编码惯例,我想澄清一下,我不是在尝试“糟糕的编码风格”,但我正在努力理解背后的原因。如果您提到的关于“坏样式”的陈述是正确的,那么它不应该被允许在ruby中的任何地方使用,并且没有理由破例破坏坏样式,因为它是坏样式。但不幸的是,这不是真的。Ruby不会握着你的手——它假设你是成年人,你知道自己在做什么。即使是Python也不能做到这一点。
def method_name
end
# or
class CamelCase
def method_name(parameter_name)
end
end