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

ruby方法名的大小写规则是什么?,ruby,Ruby,我是红宝石初学者。从这本书中,我知道Ruby方法名应该以小写字母或下划线开头。但我发现了不同的情况: 如果一个方法是在类之外定义的,那么它只能以小写字母开头,如果您试图定义一个以大写字母开头的方法,Ruby会抱怨一个错误,例如: define sayHi puts "Hello" end sayHi # => Hello 但是,以下代码不起作用: define SayHi puts "Hello" end SayHi 它将产生一个错误: :in `<main&g

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

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

    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