ruby - Ruby 中的方法名有什么限制?

标签 ruby

例如,我在下面的代码片段中找到方法名称 bundler?,但不知道 ? 字符是专门的关键字还是只是一部分方法名。

# This is a predicate useful for the doc:guides task of applications.
def bundler?
  # Note that rake sets the cwd to the one that contains the Rakefile
  # being executed.
  File.exists?('Gemfile')
end

最佳答案

Ruby 中的方法名可以包含大小写字母、数字、下划线_ 和标点符号!? , =

方法名不能以数字开头,字符!?=只能出现在末尾。

非 ASCII 字符可以用在方法名称中,但这会导致非常困惑的情况,不应该成为常见的做法。

以小写字符开头的方法名称是一种很好的做法,但不是强制性的,因为以大写字母开头的名称在 Ruby 中是常量。仍然可以为方法使用常量名称,但您将无法在没有括号的情况下调用它,因为解释器将查找该名称作为常量:

def Capital
    nil
end

Capital    # NameError: uninitialized constant Capital
Capital()  # => nil

在定义方法名称时,一些非常广泛且一贯使用的约定是:

  1. 方法名称完全小写,下划线 _ 作为名称中单词的分隔符(例如 Math::sqrtArray# each_index, ...).

  2. Predicates 以问号 ? 作为最后一个字符(例如 Array#empty?Hash#has_key? ,...)。虽然谓词通常返回 bool 值,但情况并非总是如此:如果谓词的计算结果为假,这些方法只需要返回 nilfalse,否则返回任何其他值(例如File::size? 如果文件不存在则返回 nil,否则返回文件的大小 Integer

  3. 修改调用它们的对象的状态或具有异常行为的方法的最后一个字符是感叹号 !;此方法有时称为 mutators,因为它们通常是其他方法的破坏性或就地版本(例如 Array#sort!Array#slice!, ...)。

  4. Setter 将等号 = 作为最后一个字符(例如 Array#[]=,...); Ruby interpeter 为调用 setter 方法提供了语法糖:

    a = [4, 5, 6]
    a[0] = 3    # Shorthand for a.[]=(0, 3)
    

Ruby 还允许使用运算符符号作为方法名来定义运算符:

╔═══════════════════════════╦═════════════════════════════════════════════╦═══════╗
║ Operators (by precedence) ║                 Operations                  ║ Arity ║
╠═══════════════════════════╬═════════════════════════════════════════════╬═══════╣
║ ! ~ +                     ║ Boolean NOT, bitwise complement, unary plus ║     1 ║
║                           ║ (define with method name +@, Ruby 1.9+)     ║       ║
║                           ║                                             ║       ║
║ **                        ║ Exponentiation                              ║     2 ║
║                           ║                                             ║       ║
║ -                         ║ Unary minus (define with method name -@)    ║     1 ║
║                           ║                                             ║       ║
║ * / %                     ║ Multiplication, division, modulo            ║     2 ║
║                           ║                                             ║       ║
║ + -                       ║ Addition, subtraction                       ║     2 ║
║                           ║                                             ║       ║
║ << >>                     ║ Bitwise shift                               ║     2 ║
║                           ║                                             ║       ║
║ &                         ║ Bitwise AND                                 ║     2 ║
║                           ║                                             ║       ║
║ | ^                       ║ Bitwise OR, Bitwise XOR                     ║     2 ║
║                           ║                                             ║       ║
║ < <= => >                 ║ Ordering                                    ║     2 ║
║                           ║                                             ║       ║
║ == === != =~ !~ <=>       ║ Equality, pattern matching, comparison      ║     2 ║
╚═══════════════════════════╩═════════════════════════════════════════════╩═══════╝

一元运算符方法不传递任何参数;二元运算符方法被传递一个参数,并对它和 self 进行操作。

严格遵守运算符的数量很重要;虽然可以定义具有不同元数的运算符方法(例如 + 带有两个参数的方法),Ruby 不允许您使用运算符语法调用该方法(但是它可以使用点语法).

尽可能遵守运算符的原始语义是一种很好的做法:对于了解运算符原始含义的人来说,它应该是直观的,它是如何与用户定义的类一起工作的。

该语言还为通常用于访问数组和哈希值的特殊非运算符 [] 方法提供语法糖。 [] 方法可以定义为任意数量。

对于表中的每个二元运算符,除了排序、相等、比较和模式匹配之外,Ruby 还提供缩写赋值的简写形式(例如 x += y 扩展为 x = x + y);您不能将它们定义为方法,但您可以更改它们的行为,定义它们所基于的运算符。

这些字符都不能用在普通方法名称中(例如,do&printstart-up 不是有效的方法名称)。

关于ruby - Ruby 中的方法名有什么限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10542354/

相关文章:

ruby - 如何按条件排除未使用的案例

ruby-on-rails - rails 功能测试中的身份验证问题

ruby-on-rails - 如何在 RSpec 中使用 class_double stub 类方法?

Ruby - 循环 IF x 次并更改条件

ruby-on-rails - 无法加载此类文件 - sqlite3/sqlite3_native(LoadError)

ruby - `&&=` 快捷方式是什么?

ruby-on-rails - 如果我们将参数缓存到操作中的本地变量中,它会有所帮助还是相同?

ruby-on-rails - 为什么 heroku 在 gemfile 的开发部分下跳过 gem?

ruby - 在 windows 上 rake : bad interpreter: permission denied

ruby-on-rails - Ruby 1.9.2 不存在的哈希元素