杂项语法
结束表达式
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 多个方法。
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
BEGIN 和 END
BEGIN 定义了一个块,该块在当前文件中的任何其他代码之前运行。它通常与 ruby -e 一起用于单行脚本。同样,END 定义了一个块,该块在任何其他代码之后运行。
BEGIN 必须出现在顶层,并且当您在方法中使用 END 时,它会发出警告。
这是一个例子
BEGIN { count = 0 }
您必须使用 { 和 },您不能使用 do 和 end。
这是一个示例单行脚本,它将标准输入或参数列表中的任何文件中的数字相加。
ruby -ne 'BEGIN { count = 0 }; END { puts count }; count += gets.to_i'