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

Ruby 为什么方法定义返回符号?,ruby,Ruby,定义方法时,它返回一个与方法同名的符号。这有什么意义吗?或者它只是作为你创建它的验证 像这样: def something ... end # => :something IRB尊重ruby标准“最后执行的语句的结果从方法返回”。想象一下代码: def a def b # do stuff end end 执行此代码的结果是什么?内容如下: a # => :b a.class # => Symbol < Object a #=>:b a、 阶级

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

像这样:

def something
   ...
end
# => :something

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

def a
  def b
    # do stuff
  end
end
执行此代码的结果是什么?内容如下:

a
# => :b
a.class
# => Symbol < Object
a
#=>:b
a、 阶级
#=>符号<对象
也就是说,IRB执行方法定义并返回/打印结果。很明显,这是一个
符号
实例。

想到这种用法的人:

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

public
private
protected
等方法将符号作为参数。关键是要利用这种语法。

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

例如:

class Foo
  p def bar; end
end
# => prints :bar
为什么这很有趣

您可能已经注意到,有许多方法,特别是类级方法,将另一个方法的符号化名称作为参数。您可能熟悉Rails控制器中的过滤之前的
。由于方法def返回符号,您可能会执行以下操作:

class MyController < ApplicationController
  before_filter def my_filter
     # do stuff
  end
end
class MyController
IRb始终显示调用上次计算的表达式的值的
inspect
的结果。该表达式是文本表达式、条件表达式、消息发送、类定义表达式还是方法定义表达式都无关紧要

在Ruby中,Everything返回一个值,也就是说,Everything是一个表达式,Ruby中没有语句这样的东西

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

使用Ruby 2.1。这允许您将方法定义表达式用作方法中的参数,而方法的名称应作为参数

一些例子:

# 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

就个人而言,我更希望方法定义表达式能够计算出对应于该方法的
未绑定方法
对象,以及类似
公共
私有
受保护
别名
等方法,
module\u function
等应该修改为除了
Symbol
s和
String
s之外,还可以接受
UnboundMethod
s。

put
替换为
p
prints
:bar
我认为它是2.1,而不是2.0。我最初同意你关于
UnboundMethod
对象的想法,但后来,我考虑了
attr\u…
方法和
alias
关键字,它们具有类似的特点,但不能设计为接受
UnboundMethod
对象。如果这些方法中的一些采用
UnboundMethod
对象,而另一些只采用符号,则会造成混淆。毕竟,符号似乎是引用方法名称最可靠的方式。@JörgWMittag
alias\u method
是Ruby?:-)@JörgWMittag Humm。。我还以为它在Rails中呢..谢谢大家也更新了示例中的版本。我建议使用“<2.1”和“>=2.1”来代替前后不明确的内容。这是否有记录在案?@Stefan我在RDoc中找不到任何内容。他们应该写下这一点。@sawa这个语法不漂亮。。前一个很漂亮-(@sawa我是说..@sawa我相信..我的经验很少,所以我不知道。现在我相信了。谢谢