说起 return 关键字,想必你已经很熟悉了。从语言通用性来将,所有有 return
关键字的语言,return
只有一个作用,就在在方法内部返回,可以返回一个值,也可以不返回。
对于任何语言,return
关键字的第一作用,并不是返回一个值给调用者,而是在 return
关键字处中断,且不再继续执行方法内剩下的代码,而是回调调用者处。
Ruby 中的 return
关键字也不例外。
我们今天就来讲讲 Ruby 中的 return
关键字到底有几种用法。我们大概会涉及到以下几项内容
- 显式
return
- 隐式
return
- 错误的
return
procs
和 lambda 表达式中的return
显式 return
显式 return
就是在代码中使用 return
关键字显式停止方法的执行并返回。可以携带返回值,也可以不携带返回值。
这是 return
关键字的通用使用方式,很简单,但我们还是写一个小范例来演示下
demo.rb
def explicit_return_call puts 'before return call' return 'return call' puts 'after return call' end puts explicit_return_call
运行这段代码,输出结果如下
[root@www.twle.cn ruby]# ruby demo.rb before return call return call
从运行结果中可以看到,对方法的 explicit_return_call
的执行,停止在 return
语句处句返回了,并没有执行剩下的代码,因为没有输出 after return call
同时我们也可以看到,正因为使用了 return 'return call'
返回了 return call
这个字符串,所以我们的 puts explicit_return_call
方法才会输出 return call
。
如果我们使用 return
关键字时并没有返回值,那会是什么结果呢?
要不,我们试一试
def explicit_return_call puts 'before return call' return end puts explicit_return_call
运行结果如下
[root@www.twle.cn ruby]# ruby demo.rb before return call
哈哈,输出空行。
但,千万不要以为输出的是空行就以为返回的是空字符串,如果我们没有使用 return
返回任何值,就是相当于返回了 nil
,也就是相当于调用了 return nil
。
隐式 return
对于大多数,语言,如果一个方法始终没有使用 return
关键字,代码就会执行方法的所有逻辑然后返回该语言的空,比如 C/C++ 返回 void
。
但对于 Ruby 而言,如果在某个方法中没有使用 return
关键字显式返回,那么它默认会返回最后一个表达式执行的结果。
例如下面的代码,最后输出结果就是 42
和 "简单教程,简单编程"
demo.rb
def implicit_return if true 42 else 0 end end p implicit_return def rom_ebook '简单教程,简单编程' end p rom_ebook
运行结果如下
[root@www.twle.cn ruby]# ruby demo.rb 42 "简单教程,简单编程"
对于 mplicit_return
方法,因为 if true
永远为真,所以会返回 42
这个表达式的执行结果,也就是 42
而对于 rom_ebook
方法,就更简单了,最后一个表达式也是唯一语句就是 '简单教程,简单编程'
,直接就返回该字符串了。
return
和赋值语句
当一个方法又是一个属性的赋值语句时,return
关键字的行为就有了那么一点点特别。例如下面的代码
demo.rb
class MyClass def x=(y) return 42 end end p MyClass.new.x = 21
运行结果如下
[root@www.twle.cn ruby]# ruby demo.rb 21
从输出结果中可以看到 return 42
竟然被忽略了,忽略了。取而代之的是,使用了赋值语句给予的 21 作为值。
也就是说,当赋值语句和 return
同时存在时,return
会被忽略。
错误的 return
return
关键字只能使用在方法中,在其它语句中是不可以使用的,尤其是块 ( block ) 中,千万不要认为块中也可以使用 return
关键字
demo.rb
return 42
运行结果如下
[root@www.twle.cn ruby]# ruby demo.rb demo.rb:1:in `<main>': unexpected return (LocalJumpError)
块中的 return
语句,虽然不会报错,但是结果也会让大家疑惑,
demo.rb
[].each { |n| return n } def hello puts 'Hello Mehdi!'.tap { |s| return s } end hello
运行结果如下
[root@www.twle.cn ruby]# ruby demo.rb
对的,就是没有任何输出。
procs
和 lambda 表达式中的 return
procs
和 lambda 表达式中的 return
关键字行为也有所不同,具体,我们就不再重复介绍了,你可以移步 Ruby 中的 Proc 和 Lambda 表达式 了解更多知识