当你定义一个方法时,它会返回一个与方法同名的符号。这样做有什么意义吗?还是只是为了验证你创建了它?
就像这样:
就像这样:
def something
...
end
# => :something
def something
...
end
# => :something
inspect
方法的结果。无论该表达式是文字表达式、条件表达式、消息发送、类定义表达式还是方法定义表达式都不重要。nil
,但例如Rubinius返回所定义方法的CompiledMethod
对象。Symbol
。这使您可以将方法定义表达式用作期望方法名称作为参数的方法的参数。# 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
、protected
、alias_method
、module_function
等方法也应该修改为除Symbol
和String
外还能接受UnboundMethod
。
private def foo
...
end
protected def bar
...
end
像public
,private
,protected
这样的方法需要符号作为参数。这样做的目的是利用这种语法。
class Foo
p def bar; end
end
# => prints :bar
为什么这很有意思?
你可能已经注意到,有许多方法,特别是类级别的方法,将另一个方法的符号名称作为参数。你可能熟悉Rails控制器中的before_filter
。由于方法定义返回符号,你有可能这样做:
class MyController < ApplicationController
before_filter def my_filter
# do stuff
end
end
puts
替换为 p
将会打印出 :bar
。 - StefanIRB
遵循 Ruby 标准“方法返回最后执行语句的结果”。想象一下以下代码:
def a
def b
# do stuff
end
end
执行此代码的结果是什么?如下:
a
# => :b
a.class
# => Symbol < Object
话虽如此,IRB执行该方法定义并返回/打印其结果。这明显是一个Symbol
实例。
UnboundMethod
对象的想法,但是后来我考虑了一下attr_...
方法和alias
关键字,它们在某种程度上类似,但不能被设计为接受UnboundMethod
对象。如果其中一些方法接受UnboundMethod
对象,而另一些方法只接受符号,那么这将会很令人困惑。毕竟,符号看起来是引用方法名称最可靠的方式。 - sawaalias_method
是 Ruby 中的吗? :-) - Arup Rakshit