Ruby 关于 ruby“方法” 的新手问题

jianchixuexi · 2022年03月07日 · 最后由 jianchixuexi 回复于 2022年03月08日 · 558 次阅读
def a

  def c

  'hello,world'

  end

end

p a

这段代码返回的结果是 :c 请问这是什么意思?

为什么返回的不是 'hello,world' ? 以及 c 前面的“ :”是什么意思? (刚开始学习 ruby,新手提问,尝试了搜索,找不到相关知识点)

:c 表示方法名。意思就是你在方法 a 里面定义了方法:c。一个方法通过def关键字定义之后会返回这个方法的方法名。 :c 表示中的:表示 Ruby 里面的一种数据类型Symbol。你可以通过这样去看它

> p a.class
Symbol
=> Symbol

你看 def a 这个方法定义的主体,是不是 def c .. end 这一整块?

把这一整块看作一个表达式,那么 def c 这个表达式返回什么呢?

答案就是 符号c 表示为 :c

项目中真有人这么用吗?

涉及到 2 个背景知识:

1.符号

符号 用 :xxx 来表示。符号用于 方法名、类名、常量。符号是一种特殊的数据类型,他唯一、检索速度快。所以被用于前者。想想是不是很合理?非常合理。为了性能。

2.返回值

ruby 认为所有函数都应该有返回。即使是返回空,也是一种返回。所以除了 显示调用 return 返回值,默认没有 return 的情况下,返回方法内最后一个计算值。它相当于

def a

  return def c

  'hello,world'

  end

end

所以这里,函数内部被调用,没有 return 情况下,会返回 内部定义的函数名,函数名用符号表示,所以返回 :c

补充,想要运行里面的返回函数怎么办呢?

method(a()).call

可以用户 method 获得 :c 的函数主体,然后调用 call 调用它。

我理解 :c 其实就是 'c' 的简化版,因为 :c 是只读了,而且比 'c' 少很多 API。

lanzhiheng 回复

多谢,get 了两个新知识点。

Mark24 回复

多谢解答 很清晰明了👍

需要 登录 后方可回复, 如果你还没有账号请 注册新账号