对方法的名称有哪些限制 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
已邀请:

涵秋

赞同来自:

方法B的名称B. Ruby 可能包含大写和小写字母,数字,下划线
_

和标点符号
!

,
?

,
=

.

该方法的名称不能以数字和字符开头
!

,
?


=

只能出现在最后。

在方法的方法中,您可以使用除此之外的符号 ASCII, 但这可能导致非常令人困惑的情况,不应该是常见的做法。

这是一个很好的做法,虽然没有绑定从行符号开始的方法的名称,因为以大写字母开头的名称是常量 Ruby. 您仍然可以使用该方法的常量名称,但是您将无法在没有括号的情况下调用它,因为偶数纳内勒将搜索名称作为常量:


def Capital
nil
end

Capital # NameError: uninitialized constant Capital
Capital// # => nil


一些非常广泛和一致使用。

协议

确定方法的名称时:

方法的名称是完整的小写字母,带有下划线
_

作为名称中的单词分隔符 /例如,
Math::sqrt

,
Array#each_index

, .../.


谓词

有一个问号
?

作为最后一个符号 /例如 ,
Array#empty?

,
Hash#has_key?

, .../. 虽然谓词通常返回逻辑值,但它并不总是这样:这些方法只需返回
nil

或者
false

, 如果谓词很重要 false, 否则任何其他值 /例如,
File::size?

回报
nil

, 如果文件不存在,则文件大小就像
Integer

否则/.

改变调用它们的对象状态或具有异常行为的方法具有感叹号
!

作为最后一个符号; 这些方法有时被称为

突变者

, 因为它们通常是其他方法的破坏性或本地版本。 /例如,
Array#sort!

,
Array#slice!

, .../.


pl

有平等的迹象
=

作为最后一个符号 /例如,
Array#[]=

,.../; 互联网 Ruby 提供

语法糖。

呼叫方法 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

.

严格坚持运营商的数量是重要的; 虽然您可以使用其他arity确定操作员方法 /例如,方法
+

, 这需要两个参数/, Ruby 不允许您调用操作员语法的方法 /但是,它将使用点语法/.

这是一个很好的做法,可以尽可能地坚持操作员的原始语义:它必须直观地对操作员原始值的那个,因为它适用于用户类。

语言还提供语法糖

特别的

, Neoperoto方法
[]

, 这通常用于访问数组的值和 hash. 方法
[]

它可以用任意的arity确定。

对于表中的每个二进制运算符,除了简化,平等,比较和与样品的比较之外, Ruby 还提供缩写约会 /例如,
x += y

在之前展开
x = x + y

/; 您无法将它们定义为方法,但您可以通过定义所基于的运算符来更改其行为。

这些字符都不可以在普通的方法中使用。 /例如,
do&print

或者
start-up

不是允许的方法名称/.

二哥

赞同来自:

别人对内置语法是真的,但是,如果使用此类方法,似乎没有内部限制可以使用的内容
define_method

+
send

:


define_method/:'$% ^&'/ { 0 }
define_method/:'你好'/ { 1 }

send/:'$% ^&'/ == 0 or raise
send/:'你好'/ == 1 or raise


这个事实可能有用:例如
http://api.rubyonrails.org/cla ... -test
方法 Rails' ActiveSupport::Testing::Declarative.test 用它不得进行复杂的转换:


test 'Some Controller#Method' do


更常见的名称,可以与另一个测试冲突,命名为:


test 'Some Controller_Method' do


这是说明的
http://guides.rubyonrails.org/ ... odels
.

好奇心:发生类似的东西 Java, 字节代码方法的名称提供比语言更多的选择 Java:
https://coderoad.ru/26791204/

董宝中

赞同来自:

方法名称可能结束
!

,
?

或者
=

. 也允许下划线。 除了 , 有几种方法 , 这看起来像运营商 /例如 ,
+

,
*

,
>>

,
[]

/, 您可以确定您自己的课程。

小明明

赞同来自:

要添加一件事:您也可以说要启动方法的对象

未命名一般

, 他将尝试调用一个名为的方法
call

:


#!/usr/bin/env ruby

class Foo

=begin
def call/*args/
puts "received call with #{args.join/' '/}"
end
=end

def method_missing/m, *args, &block/
puts "received method_missing on `#{m}/#{args.join/', '/}/`"
end

end

f = Foo.new
f./'hi'/ # Not a syntax error! method_missing with m of :call
f.send :'', 'hmm' # method_missing with m set to :''
f.send nil, 'bye' # raises an error


事实上,没有命名方法
call

, 被定义为
Object

, 但课程中有一个
Method


Proc

.

用某种语言
//

- 这是函数调用运算符,它非常类似于在此发生的内容。

例如,这是使用的 Rails' JBuilder:

https://github.com/rails/jbuilder
这将在页面上记录。 196 图书 O'Reilly Ruby:

Ruby 1.9 提供额外的方式来调用对象
Proc

; 替代方括号,您可以使用带有点前缀的括号:


z = f./x,y/



.//

看起来呼叫对没有该方法的名称的方法。 这不是可以确定的操作员,而是导致该方法的语法糖
call

. 它可以与任何确定方法的对象一起使用
call

并且不限于物体
Proc

.

莫问

赞同来自:

允许的符号是:
a-Z,

,
0-9

, 如果他们不是开始,
_

, 和
?

/对于布尔函数/, 和
!

/对于破坏性的功能/, 和
=

/用于定居者/.

要回复问题请先登录注册