杂项语法

结束表达式

Ruby 使用换行符作为表达式的结尾。当用运算符、左括号、逗号等结束一行时,表达式将继续。

你可以用 ;(分号)结束表达式。分号最常与 ruby -e 一起使用。

缩进

Ruby 不需要任何缩进。通常,ruby 程序缩进两个空格。

如果你在启用警告的情况下运行 ruby,并且缩进不匹配,你将收到警告。

alias

alias 关键字最常用于别名方法。在别名方法时,你可以使用它的名称或符号

alias new_name old_name
alias :new_name :old_name

对于方法,Module#alias_method 通常可以代替 alias 使用。

你还可以使用 alias 为全局变量创建别名

$old = 0

alias $new $old

p $new # prints 0

您可以在任何作用域中使用 alias

undef

undef 关键字阻止当前类响应对命名方法的调用。

undef my_method

您可以使用符号代替方法名称

undef :my_method

您可以取消定义多个方法

undef method1, method2

您可以在任何作用域中使用 undef。另请参见 Module#undef_method

defined?

defined? 是一个关键字,它返回一个描述其参数的字符串

p defined?(UNDEFINED_CONSTANT) # prints nil
p defined?(RUBY_VERSION)       # prints "constant"
p defined?(1 + 1)              # prints "method"

您无需在 defined? 中使用括号,但由于 defined?优先级较低,因此建议使用括号。

例如,如果您希望检查实例变量是否存在且实例变量为零

defined? @instance_variable && @instance_variable.zero?

这将返回 "expression",如果您未定义实例变量,则这不是您想要的。

@instance_variable = 1
defined?(@instance_variable) && @instance_variable.zero?

在检查实例变量是否已定义时添加括号是一个更好的检查。当未定义实例变量时,这将正确返回 nil,当实例变量不为零时,将正确返回 false

使用特定反射方法(例如,对于实例变量使用 instance_variable_defined?,对于常量使用 const_defined?)比使用 defined? 产生的错误更少。

defined? 根据是否存在活动正则表达式匹配以及捕获组的数量专门处理一些正则表达式全局变量

/b/ =~ 'a'
defined?($~) # => "global-variable"
defined?($&) # => nil
defined?($`) # => nil
defined?($') # => nil
defined?($+) # => nil
defined?($1) # => nil
defined?($2) # => nil

/./ =~ 'a'
defined?($~) # => "global-variable"
defined?($&) # => "global-variable"
defined?($`) # => "global-variable"
defined?($') # => "global-variable"
defined?($+) # => nil
defined?($1) # => nil
defined?($2) # => nil

/(.)/ =~ 'a'
defined?($~) # => "global-variable"
defined?($&) # => "global-variable"
defined?($`) # => "global-variable"
defined?($') # => "global-variable"
defined?($+) # => "global-variable"
defined?($1) # => "global-variable"
defined?($2) # => nil

BEGINEND

BEGIN 定义一个块,该块在当前文件中的任何其他代码之前运行。它通常与 ruby -e 一起在单行程序中使用。类似地,END 定义一个块,该块在任何其他代码之后运行。

BEGIN 必须出现在顶级,当您在方法内部使用 END 时,它将发出警告。

这里有一个示例

BEGIN {
  count = 0
}

您必须使用 {},不能使用 doend

这里有一个单行程序示例,它从标准输入或参数列表中的任何文件中添加数字

ruby -ne 'BEGIN { count = 0 }; END { puts count }; count += gets.to_i'