定义方法时,它返回一个与方法同名的符号。这有什么意义吗?或者它只是作为你创建的验证吗?
像这样:
def something
...
end
# => :something
答案 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
对象,以及public
,private
,{{1}等方法除了protected
和alias_method
s之外,还应修改} {,module_function
,UnboundMethod
等以接受Symbol
。
答案 1 :(得分:4)
proposed考虑到这种用法的人:
private def foo
...
end
protected def bar
...
end
public
,private
,protected
等方法将符号作为参数。关键是要使用这种语法。
答案 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
实例。