变量是持有可被任何程序使用的任何数据的存储位置。
Ruby 支持五种类型的变量。
$
开头:全局变量(Global variable)。@
开头:实例变量(Instance variable)。@@
开头:类变量(Class variable)类变量被共享在整个继承链中全局变量以 $
开头。未初始化的全局变量的值为 nil
,在使用 -w
选项后,会产生警告。
给全局变量赋值会改变全局状态,所以不建议使用全局变量。
下面的实例显示了全局变量的用法。
#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
$global_variable = 10
class Class1
def print_global
puts "全局变量在 Class1 中输出为 #$global_variable"
end
end
class Class2
def print_global
puts "全局变量在 Class2 中输出为 #$global_variable"
end
end
class1obj = Class1.new
class1obj.print_global
class2obj = Class2.new
class2obj.print_global
在这里,$global_variable 是全局变量。这将产生以下结果:
注意:在 Ruby 中,您可以通过在变量或常量前面放置 # 字符,来访问任何变量或常量的值。
全局变量在 Class1 中输出为 10
全局变量在 Class2 中输出为 10
实例变量以 @
开头。未初始化的实例变量的值为 nil,在使用 -w 选项后,会产生警告。
下面的实例显示了实例变量的用法。
实例
#!/usr/bin/ruby
class Customer
def initialize(id, name, addr)
@cust_id=id
@cust_name=name
@cust_addr=addr
end
def display_details()
puts "Customer id #@cust_id"
puts "Customer name #@cust_name"
puts "Customer address #@cust_addr"
end
end
# 创建对象
cust1=Customer.new("1", "John", "Wisdom Apartments, Ludhiya")
cust2=Customer.new("2", "Poul", "New Empire road, Khandala")
# 调用方法
cust1.display_details()
cust2.display_details()
尝试一下 »
在这里,@cust_id
、@cust_name
和 @cust_addr
是实例变量。这将产生以下结果:
Customer id 1
Customer name John
Customer address Wisdom Apartments, Ludhiya
Customer id 2
Customer name Poul
Customer address New Empire road, Khandala
类变量以 @@
开头,且必须初始化后才能在方法定义中使用。
引用一个未初始化的类变量会产生错误。类变量在定义它的类或模块的子类或子模块中可共享使用。
在使用 -w 选项后,重载类变量会产生警告。
下面的实例显示了类变量的用法。
#!/usr/bin/ruby
class Customer
@@no_of_customers=0
def initialize(id, name, addr)
@cust_id=id
@cust_name=name
@cust_addr=addr
end
def display_details()
puts "Customer id #@cust_id"
puts "Customer name #@cust_name"
puts "Customer address #@cust_addr"
end
def total_no_of_customers()
@@no_of_customers += 1
puts "Total number of customers: #@@no_of_customers"
end
end
# 创建对象
cust1=Customer.new("1", "John", "Wisdom Apartments, Ludhiya")
cust2=Customer.new("2", "Poul", "New Empire road, Khandala")
# 调用方法
cust1.total_no_of_customers()
cust2.total_no_of_customers()
在这里,@@no_of_customers
是类变量。这将产生以下结果:
Total number of customers: 1
Total number of customers: 2
局部变量以小写字母或下划线 _ 开头。
局部变量的作用域从 class
、module
、def
或do
到相对应的结尾或者从左大括号到右大括号 {}。
当调用一个未初始化的局部变量时,它被解释为调用一个不带参数的方法。
对未初始化的局部变量赋值也可以当作是变量声明。变量会一直存在,直到当前域结束为止。局部变量的生命周期在 Ruby 解析程序时确定。
在上面的实例中,局部变量是id
、name
和 addr
。
常量以大写字母开头。定义在类或模块内的常量可以从类或模块的内部访问,定义在类或模块外的常量可以被全局访问。
常量不能定义在方法内。引用一个未初始化的常量会产生错误。对已经初始化的常量赋值会产生警告。
#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
class Example
VAR1 = 100
VAR2 = 200
def show
puts "第一个常量的值为 #{VAR1}"
puts "第二个常量的值为 #{VAR2}"
end
end
# 创建对象
object=Example.new()
object.show
在这里,VAR1 和 VAR2 是常量。这将产生以下结果:
第一个常量的值为 100
第二个常量的值为 200
它们是特殊的变量,有着局部变量的外观,但行为却像常量。您不能给这些变量赋任何值。
Ruby 支持一套丰富的运算符。大多数运算符实际上是方法调用。例如,a + b 被解释为 a.+(b),其中指向变量 a 的 + 方法被调用,b 作为方法调用的参数。
对于每个运算符(+ - * / % ** & | ^ << >> && ||)
,都有一个相对应的缩写赋值运算符(+= -=
等等)。
假设变量 a 的值为 10,变量 b 的值为 20,那么:
运算符 | 描述 | 实例 |
---|---|---|
+ | 加法 | 把运算符两边的操作数相加 a + b 将得到 30 |
- | 减法 | - 把左操作数减去右操作数 a - b 将得到 -10 |
* | 乘法 | - 把运算符两边的操作数相乘 a * b 将得到 200 |
/ | 除法 | - 把左操作数除以右操作数 b / a 将得到 2 |
% | 求模 | - 把左操作数除以右操作数,返回余数 b % a 将得到 0 |
** | 指数 | - 执行指数计算 a**b 将得到 10 的 20 次方 |
运算符 | 描述 | 实例 |
---|---|---|
== | 检查两个操作数的值是否相等,如果相等则条件为真。 | (a == b) 不为真。 |
!= | 检查两个操作数的值是否相等,如果不相等则条件为真。 | (a != b) 为真。 |
> | 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 | (a > b) 不为真。 |
< | 检查左操作数的值是否小于右操作数的值,如果是则条件为真。 | (a < b) 为真。 |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 | (a >= b) 不为真。 |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 | (a <= b) 为真。 |
<=> | 联合比较运算符。如果第一个操作数等于第二个操作数则返回 0,如果第一个操作数大于第二个操作数则返回 1,如果第一个操作数小于第二个操作数则返回 -1。 | (a <=> b) 返回 -1。 |
=== | 用于测试 case 语句的 when 子句内的相等。 | (1…10) === 5 返回 true。 |
.eql? | 如果接收器和参数具有相同的类型和相等的值,则返回 true。 | 1 == 1.0 返回 true,但是 1.eql?(1.0) 返回 false。 |
equal? | 如果接收器和参数具有相同的对象 id,则返回 true。 | 如果 aObj 是 bObj 的副本,那么 aObj == bObj 返回 true,a.equal?bObj 返回 false,但是 a.equal?aObj 返回 true。 |
运算符 | 描述 | 实例 |
---|---|---|
= | 简单的赋值运算符,把右操作数的值赋给左操作数 | c = a + b 将把 a + b 的值赋给 c |
+= | 加且赋值运算符,把右操作数加上左操作数的结果赋值给左操作数 | c += a 相当于 c = c + a |
-= | 减且赋值运算符,把左操作数减去右操作数的结果赋值给左操作数 | c -= a 相当于 c = c - a |
*= | 乘且赋值运算符,把右操作数乘以左操作数的结果赋值给左操作数 | c *= a 相当于 c = c * a |
/= | 除且赋值运算符,把左操作数除以右操作数的结果赋值给左操作数 | c /= a 相当于 c = c / a |
%= | 求模且赋值运算符,求两个操作数的模赋值给左操作数 | c %= a 相当于 c = c % a |
**= | 指数且赋值运算符,执行指数计算,并赋值给左操作数 | c **= a 相当于 c = c ** a |
Ruby 也支持变量的并行赋值。这使得多个变量可以通过一行的 Ruby 代码进行初始化。例如:
a = 10
b = 20
c = 30
使用并行赋值可以更快地声明:
a, b, c = 10, 20, 30
并行赋值在交换两个变量的值时也很有用:
a, b = b, c
位运算符作用于位,并逐位执行操作。
假设如果 a = 60,且 b = 13,现在以二进制格式,它们如下所示:
a = 0011 1100
b = 0000 1101
a&b = 0000 1100
a|b = 0011 1101
a^b = 0011 0001
~a = 1100 0011
下表列出了 Ruby 支持的位运算符。
运算符 | 描述 | 实例 |
---|---|---|
& | 如果同时存在于两个操作数中,二进制 AND 运算符复制一位到结果中。 | (a & b) 将得到 12,即为 0000 1100 |
如果存在于任一操作数中,二进制 OR 运算符复制一位到结果中。 | (a | |
^ | 如果存在于其中一个操作数中但不同时存在于两个操作数中,二进制异或运算符复制一位到结果中。 | (a ^ b) 将得到 49,即为 0011 0001 |
~ | 二进制补码运算符是一元运算符,具有"翻转"位效果,即0变成1,1变成0。 | (~a ) 将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式。 |
<< | 二进制左移运算符。左操作数的值向左移动右操作数指定的位数。 | a << 2 将得到 240,即为 1111 0000 |
>> | 二进制右移运算符。左操作数的值向右移动右操作数指定的位数。 | a >> 2 将得到 15,即为 0000 1111 |
下表列出了 Ruby 支持的逻辑运算符。
运算符 | 描述 | 实例 |
---|---|---|
and | 称为逻辑与运算符。如果两个操作数都为真,则条件为真。 | (a and b) 为真。 |
or | 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。 | (a or b) 为真。 |
&& | 称为逻辑与运算符。如果两个操作数都非零,则条件为真。 | (a && b) 为真。 |
称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。 | ||
! | 称为逻辑非运算符。用来逆转操作数的逻辑状态。 | 如果条件为真则逻辑非运算符将使其为假。 !(a && b) 为假。 |
not | 称为逻辑非运算符。用来逆转操作数的逻辑状态。 | 如果条件为真则逻辑非运算符将使其为假。 not(a && b) 为假。 |
运算符 | 描述 | 实例 |
---|---|---|
? : | 条件表达式 | 如果条件为真 ? 则值为 X : 否则值为 Y |
在 Ruby
中,序列范围用于创建一系列连续的值 - 包含起始值、结束值(视情况而定)和它们之间的值。
在 Ruby
中,这些序列是使用 “…” 和 “…” 范围运算符来创建的。两点形式创建的范围包含起始值和结束值,三点形式创建的范围只包含起始值不包含结束值。
运算符 | 描述 | 实例 |
---|---|---|
… | 创建一个从开始点到结束点的范围(包含结束点) | 1…10 创建从 1 到 10 的范围 |
… | 创建一个从开始点到结束点的范围(不包含结束点) | 1…10 创建从 1 到 9 的范围 |
defined?
是一个特殊的运算符,以方法调用的形式来判断传递的表达式是否已定义。它返回表达式的描述字符串,如果表达式未定义则返回 nil。
下面是 defined? 运算符的各种用法:
用法 1
defined? variable # 如果 variable 已经初始化,则为 True
例如:
foo = 42
defined? foo # => "local-variable"
defined? $_ # => "global-variable"
defined? bar # => nil(未定义)
用法 2
defined? method_call # 如果方法已经定义,则为 True
例如:
defined? puts # => "method"
defined? puts(bar) # => nil(在这里 bar 未定义)
defined? unpack # => nil(在这里未定义)
用法 3
# 如果存在可被 super 用户调用的方法,则为 True
defined? super
例如:
defined? super # => "super"(如果可被调用)
defined? super # => nil(如果不可被调用)
用法 4
defined? yield # 如果已传递代码块,则为 True
例如:
defined? yield # => "yield"(如果已传递块)
defined? yield # => nil(如果未传递块)
你可以通过在方法名称前加上类或模块名称和.
来调用类或模块中的方法。你可以使用类或模块名称和两个冒号::
来引用类或模块中的常量。
::
是一元运算符,允许在类或模块内定义常量、实例方法和类方法,可以从类或模块外的任何地方进行访问。
请记住:在 Ruby 中,类和方法也可以被当作常量。
你只需要在表达式的常量名前加上::
前缀,即可返回适当的类或模块对象。
如果::
前的表达式为类或模块名称,则返回该类或模块内对应的常量值;如果::
前未没有前缀表达式,则返回主Object类中对应的常量值。 。
下面是两个实例:
MR_COUNT = 0 # 定义在主 Object 类上的常量
module Foo
MR_COUNT = 0
::MR_COUNT = 1 # 设置全局计数为 1
MR_COUNT = 2 # 设置局部计数为 2
end
puts MR_COUNT # 这是全局常量
puts Foo::MR_COUNT # 这是 "Foo" 的局部常量
第二个实例:
CONST = ' out there'
class Inside_one
CONST = proc {' in there'}
def where_is_my_CONST
::CONST + ' inside one'
end
end
class Inside_two
CONST = ' inside two'
def where_is_my_CONST
CONST
end
end
puts Inside_one.new.where_is_my_CONST
puts Inside_two.new.where_is_my_CONST
puts Object::CONST + Inside_two::CONST
puts Inside_two::CONST + CONST
puts Inside_one::CONST
puts Inside_one::CONST.call + Inside_two::CONST
注释是在运行时会被忽略的Ruby
代码内的注释行。单行注释以 # 字符开始,直到该行结束,如下所示:
#!/usr/bin/ruby -w
# 这是一个单行注释。
puts "Hello, Ruby!"
当执行时,上面的程序会产生以下结果:
Hello, Ruby!
您可以使用 =begin
和 =end
语法注释多行,如下所示:
#!/usr/bin/ruby -w
puts "Hello, Ruby!"
=begin
这是一个多行注释。
可扩展至任意数量的行。
但 =begin 和 =end 只能出现在第一行和最后一行。
=end
当执行时,上面的程序会产生以下结果:
Hello, Ruby!
请确保尾部的注释离代码有足够的距离,以便容易区分注释和代码。如果尾部超过一条注释,请将它们对齐。例如:
实例
@counter # 跟踪页面被点击的次数
@siteCounter # 跟踪所有页面被点击的次数
Ruby 提供了几种很常见的条件结构。在这里,我们将解释所有的条件语句和 Ruby 中可用的修饰符。
语法
if conditional [then]
code...
[elsif conditional [then]
code...]...
[else
code...]
end
if 表达式用于条件执行。值 false
和 nil
为假,其他值都为真。
请注意,Ruby 使用 elsif
,不是使用 else if
和 elif
。
如果 conditional
为真,则执行 code
。
如果 conditional
不为真,则执行 else
子句中指定的 code
。
通常我们省略保留字 then 。若想在一行内写出完整的 if 式,则必须以 then 隔开条件式和程式区块。如下所示:
if a == 4 then a = 7 end
实例
#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
x=1
if x > 2
puts "x 大于 2"
elsif x <= 2 and x!=0
puts "x 是 1"
else
puts "无法得知 x 的值"
end
以上实例输出结果:
x 是 1
语法
code if condition
if
修饰词组表示当 if
右边之条件成立时才执行if
左边的式子。
即如果 conditional
为真,则执行 code
。
实例
#!/usr/bin/ruby
$debug=1
print "debug\n" if $debug
以上实例输出结果:
debug
语法
unless conditional [then]
code
[else
code ]
end
unless
式和if
式作用相反,即如果 conditional
为假,则执行 code
。
如果 conditional
为真,则执行 else
子句中指定的 code
。
实例
#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
x=1
unless x>2
puts "x 小于 2"
else
puts "x 大于 2"
end
以上实例输出结果为:
x 小于 2
语法
code unless conditional
如果 conditional
为假,则执行 code
。
实例
#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
$var = 1
print "1 -- 这一行输出\n" if $var
print "2 -- 这一行不输出\n" unless $var
$var = false
print "3 -- 这一行输出\n" unless $var
以上实例输出结果:
1 -- 这一行输出
3 -- 这一行输出
语法
case expression
[when expression [, expression ...] [then]
code ]...
[else
code ]
end
case
先对一个 expression
进行匹配判断,然后根据匹配结果进行分支选择。
它使用===
运算符比较when
指定的 expression
,若一致的话就执行 when 部分的内容。
通常我们省略保留字 then 。若想在一行内写出完整的 when 式,则必须以 then 隔开条件式和程式区块。如下所示:
when a == 4 then a = 7 end
因此:
case expr0
when expr1, expr2
stmt1
when expr3, expr4
stmt2
else
stmt3
end
基本上类似于:
_tmp = expr0
if expr1 === _tmp || expr2 === _tmp
stmt1
elsif expr3 === _tmp || expr4 === _tmp
stmt2
else
stmt3
end
实例
#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
$age = 5
case $age
when 0 .. 2
puts "婴儿"
when 3 .. 6
puts "小孩"
when 7 .. 12
puts "child"
when 13 .. 18
puts "少年"
else
puts "其他年龄段的"
end
以上实例输出结果为:
小孩
当case的"表达式"部分被省略时,将计算第一个when条件部分为真的表达式。
foo = false
bar = true
quu = false
case
when foo then puts 'foo is true'
when bar then puts 'bar is true'
when quu then puts 'quu is true'
end
# 显示 "bar is true"
Ruby 中的循环用于执行相同的代码块若干次。
语法
while conditional [do]
code
end
或者
语法
while conditional [:]
code
end
当 conditional
为真时,执行 code。
语法中 do 或 : 可以省略不写。但若要在一行内写出 while 式,则必须以 do 或 : 隔开条件式或程式区块。
实例
#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
$i = 0
$num = 5
while $i < $num do
puts("在循环语句中 i = #$i" )
$i +=1
end
尝试一下 »
以上实例输出结果为:
在循环语句中 i = 0
在循环语句中 i = 1
在循环语句中 i = 2
在循环语句中 i = 3
在循环语句中 i = 4
语法
code while condition
或者
begin
code
end while conditional
当 conditional
为真时,执行 code。
如果 while
修饰符跟在一个没有 rescue
或 ensure
子句的 begin
语句后面,code 会在 conditional
判断之前执行一次。
实例
#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
$i = 0
$num = 5
begin
puts("在循环语句中 i = #$i" )
$i +=1
end while $i < $num
尝试一下 »
以上实例输出结果为:
在循环语句中 i = 0
在循环语句中 i = 1
在循环语句中 i = 2
在循环语句中 i = 3
在循环语句中 i = 4
语法
until conditional [do]
code
end
当 conditional
为假时,执行 code
。
语法中 do 可以省略不写。但若要在一行内写出 until 式,则必须以 do 隔开条件式或程式区块。
实例
#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
$i = 0
$num = 5
until $i > $num do
puts("在循环语句中 i = #$i" )
$i +=1;
end
尝试一下 »
以上实例输出结果为:
在循环语句中 i = 0
在循环语句中 i = 1
在循环语句中 i = 2
在循环语句中 i = 3
在循环语句中 i = 4
在循环语句中 i = 5
语法
code until conditional
或者
begin
code
end until conditional
当 conditional
为 false
时,执行 code
。
如果 until
修饰符跟在一个没有rescue
或 ensure
子句的 begin
语句后面,code
会在conditional
判断之前执行一次。
实例
#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
$i = 0
$num = 5
begin
puts("在循环语句中 i = #$i" )
$i +=1;
end until $i > $num
以上实例输出结果为:
在循环语句中 i = 0
在循环语句中 i = 1
在循环语句中 i = 2
在循环语句中 i = 3
在循环语句中 i = 4
在循环语句中 i = 5
语法
for variable [, variable ...] in expression [do]
code
end
先计算表达式得到一个对象,然后针对 expression 中的每个元素分别执行一次 code。
实例
#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
for i in 0..5
puts "局部变量的值为 #{i}"
end
在这里,我们已经定义了范围 0…5。语句 for i in 0…5 允许 i 的值从 0 到 5(包含 5)。
以上实例输出结果为:
局部变量的值为 0
局部变量的值为 1
局部变量的值为 2
局部变量的值为 3
局部变量的值为 4
局部变量的值为 5
for...in
循环几乎是完全等价于:
(expression).each do |variable[, variable...]| code end
但是,for
循环不会为局部变量创建一个新的作用域。
语法中 do
可以省略不写。但若要在一行内写出for
式,则必须以 do
隔开条件式或程式区块。
实例
#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
(0..5).each do |i|
puts "局部变量的值为 #{i}"
end
以上实例输出结果为:
局部变量的值为 0
局部变量的值为 1
局部变量的值为 2
局部变量的值为 3
局部变量的值为 4
局部变量的值为 5
语法
break
终止最内部的循环。如果在块内调用,则终止相关块的方法(方法返回 nil)。
实例
#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
for i in 0..5
if i > 2 then
break
end
puts "局部变量的值为 #{i}"
end
尝试一下 »
以上实例输出结果为:
局部变量的值为 0
局部变量的值为 1
局部变量的值为 2
语法
next
跳到循环的下一个迭代。如果在块内调用,则终止块的执行(yield
表达式返回 nil
)。
实例
#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
for i in 0..5
if i < 2 then
next
end
puts "局部变量的值为 #{i}"
end
以上实例输出结果为:
局部变量的值为 2
局部变量的值为 3
局部变量的值为 4
局部变量的值为 5
语法
redo
重新开始最内部循环的该次迭代,不检查循环条件。
如果在块内调用,则重新开始 yield
或 call
。
实例
#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
for i in 0..5
if i < 2 then
puts "局部变量的值为 #{i}"
redo
end
end
这将产生以下结果,并会进入一个无限循环:
局部变量的值为 0
局部变量的值为 0
............................
注意:1.9以及之后的版本不支持在循环中使用retry。
语法
retry
如果 retry
出现在 begin
表达式的 rescue
子句中,则从 begin
主体的开头重新开始。
begin
do_something # 抛出的异常
rescue
# 处理错误
retry # 重新从 begin 开始
end
如果 retry 出现在迭代内、块内或者 for 表达式的主体内,则重新开始迭代调用。迭代的参数会重新评估。
for i in 1..5
retry if some_condition # 重新从 i == 1 开始
end
实例
#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
for i in 1..5
retry if i > 2
puts "局部变量的值为 #{i}"
end
这将产生以下结果,并会进入一个无限循环:
局部变量的值为 1
局部变量的值为 2
局部变量的值为 1
局部变量的值为 2
局部变量的值为 1
局部变量的值为 2
............................
Ruby 方法与其他编程语言中的函数类似。Ruby 方法用于捆绑一个或多个重复的语句到一个单元中。
方法名应以小写字母开头。如果您以大写字母作为方法名的开头,Ruby 可能会把它当作常量,从而导致不正确地解析调用。
方法应在调用之前定义,否则 Ruby 会产生未定义的方法调用异常。
语法
def method_name [( [arg [= default]]...[, * arg [, &expr ]])]
expr..
end
所以,您可以定义一个简单的方法,如下所示:
def method_name
expr..
end
您可以定义一个接受参数的方法,如下所示:
def method_name (var1, var2)
expr..
end
您可以为参数设置默认值,如果方法调用时未传递必需的参数则使用默认值:
def method_name (var1=value1, var2=value2)
expr..
end
当您要调用方法时,只需要使用方法名即可,如下所示:
method_name
但是,当您调用带参数的方法时,您在写方法名时还要带上参数,例如:
method_name 25, 30
使用带参数方法最大的缺点是调用方法时需要记住参数个数。例如,如果您向一个接受三个参数的方法只传递了两个参数,Ruby 会显示错误。
实例
#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
def test(a1="Ruby", a2="Perl")
puts "编程语言为 #{a1}"
puts "编程语言为 #{a2}"
end
test "C", "C++"
test
尝试一下 »
以上实例运行输出结果为:
编程语言为 C
编程语言为 C++
编程语言为 Ruby
编程语言为 Perl
Ruby 中的每个方法默认都会返回一个值。这个返回的值是最后一个语句的值。例如:
实例
def test
i = 100
j = 10
k = 0
end
在调用这个方法时,将返回最后一个声明的变量 k。
Ruby 中的 return 语句用于从 Ruby
方法中返回一个或多个值。
语法
return [expr[`,' expr...]]
如果给出超过两个的表达式,包含这些值的数组将是返回值。如果未给出表达式,nil
将是返回值。
实例
return
或
return 12
或
return 1,2,3
看看下面的实例:
#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
def test
i = 100
j = 200
k = 300
return i, j, k
end
var = test
puts var
尝试一下 »
以上实例运行输出结果为:
100
200
300
假设您声明了一个带有两个参数的方法,当您调用该方法时,您同时还需要传递两个参数。
但是,Ruby 允许您声明参数数量可变的方法。让我们看看下面的实例:
#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
def sample (*test)
puts "参数个数为 #{test.length}"
for i in 0...test.length
puts "参数值为 #{test[i]}"
end
end
sample "Zara", "6", "F"
sample "Mac", "36", "M", "MCA"
尝试一下 »
在这段代码中,您已经声明了一个方法 sample
,接受一个参数 test。但是,这个参数是一个变量参数。这意味着参数可以带有不同数量的变量。以上实例运行输出结果为:
参数个数为 3
参数值为 Zara
参数值为 6
参数值为 F
参数个数为 4
参数值为 Mac
参数值为 36
参数值为 M
参数值为 MCA
当方法定义在类的外部,方法默认标记为 private
。另一方面,如果方法定义在类中的,则默认标记为public
。
方法默认的可见性和 private
标记可通过模块(Module
)的public
或 private
改变。
当你想要访问类的方法时,您首先需要实例化类。然后,使用对象,您可以访问类的任何成员。
Ruby
提供了一种不用实例化即可访问方法的方式。让我们看看如何声明并访问类方法:
class Accounts
def reading_charge
end
def Accounts.return_date
end
end
我们已经知道方法 return_date 是如何声明的。它是通过在类名后跟着一个点号,点号后跟着方法名来声明的。您可以直接访问类方法,如下所示:
Accounts.return_date
如需访问该方法,您不需要创建类 Accounts 的对象。
这个语句用于为方法或全局变量起别名。别名不能在方法主体内定义。
即使方法被重写,方法的别名也保持方法的当前定义。
为编号的全局变量($1, $2,…)起别名是被禁止的。重写内置的全局变量可能会导致严重的问题。
语法
alias 方法名 方法名
alias 全局变量 全局变量
实例
alias foo bar
alias $MATCH $&
在这里,我们已经为 bar
定义了别名为foo
,为$&
定义了别名为 $MATCH
。
这个语句用于取消方法定义。undef
不能出现在方法主体内。
通过使用 undef
和 alias
,类的接口可以从父类独立修改,但请注意,在自身内部方法调用时,它可能会破坏程序。
undef 方法名
实例
下面的实例取消名为 bar的方法定义:
undef bar