Ruby 中的 return 关键字

yufei       5 年, 6 月 前       3240

说起 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 表达式 了解更多知识

目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.