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örgWMittagalias\u method
是Ruby?:-)@JörgWMittag Humm。。我还以为它在Rails中呢..谢谢大家也更新了示例中的版本。我建议使用“<2.1”和“>=2.1”来代替前后不明确的内容。这是否有记录在案?@Stefan我在RDoc中找不到任何内容。他们应该写下这一点。@sawa这个语法不漂亮。。前一个很漂亮-(@sawa我是说..@sawa我相信..我的经验很少,所以我不知道。现在我相信了。谢谢