为什么方法定义会返回符号?

时间:2014-10-06 12:05:07

标签: ruby

定义方法时,它返回一个与方法同名的符号。这有什么意义吗?或者它只是作为你创建的验证吗?

像这样:

def something
   ...
end
# => :something

4 个答案:

答案 0 :(得分:9)

IRb 始终显示对已评估的最后一个表达式的值调用inspect的结果。该表达式是文字表达式,条件表达式,消息发送,类定义表达式还是方法定义表达式无关紧要。

Everything 在Ruby中返回一个值,即所有是一个表达式,Ruby中没有这样的语句。

过去,方法定义表达式的返回值未定义。大多数Ruby实现只是从方法定义表达式返回nil,但Rubinius例如返回了已定义方法的CompiledMethod对象。

使用Ruby 2.1,the return value of a method definition expression was standardized to be the Symbol corresponding to the method's name。这允许您将方法定义表达式用作期望方法名称作为参数的方法中的参数。

一些例子:

# Before Ruby 2.0:
def foo; end
private :foo

# After Ruby 2.0:
private def foo; end # similar for `protected`, `public`, `module_function`

# Before Ruby 2.0:
def map; end
alias_method :collect, :map

# After Ruby 2.0:
alias_method :collect, def map; end

就个人而言,我更倾向于使用方法定义表达式来评估与该方法对应的UnboundMethod对象,以及publicprivate,{{1}等方法除了protectedalias_method s之外,还应修改} {,module_functionUnboundMethod等以接受Symbol

答案 1 :(得分:4)

proposed考虑​​到这种用法的人:

private def foo
  ...
end
protected def bar
  ...
end

publicprivateprotected等方法将符号作为参数。关键是要使用这种语法。

答案 2 :(得分:2)

所有方法defs返回Ruby> = 2.1中的符号(不仅仅是IRB中的符号)。

例如:

class Foo
  p def bar; end
end
# => prints :bar

为什么这很有意思?

您可能已经注意到,有许多方法,特别是类级方法,将另一个方法的符号名称作为参数。您可能熟悉Rails控制器中的before_filter。由于方法defs返回符号,您可能会这样做:

class MyController < ApplicationController
  before_filter def my_filter
     # do stuff
  end
end

答案 3 :(得分:0)

IRB尊重ruby标准“从方法返回最后执行语句的结果。”想象一下代码:

def a
  def b
    # do stuff
  end
end

执行此代码的结果是什么?它如下:

a
# => :b
a.class
# => Symbol < Object

也就是说,IRB执行方法定义并返回/打印出它的结果。显然,这是一个Symbol实例。