首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >&:带有参数的方法的语法

&:带有参数的方法的语法
EN

Stack Overflow用户
提问于 2017-09-17 08:56:55
回答 2查看 87关注 0票数 0

我有一个嵌套数组:

代码语言:javascript
复制
a = [[1, "Aldous Huxley"],
     [3, "Sinclair Lewis"],
     [2, "Ernest Hemingway"],
     [4,"Anthony Burgess"]]

a.collect { |author| author.drop(1) }

输出

代码语言:javascript
复制
[["Aldous Huxley"], ["Sinclair Lewis"], ["Ernest Hemingway"], ["Anthony Burgess"]]

a.collect(&:drop(1))

给了我一个罪恶的错误。

代码语言:javascript
复制
SyntaxError: (irb):18: syntax error, unexpected '(', expecting ')'
a.collect(&:drop(1))
                  ^

可以用&:语法定义我的原始块表达式吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-17 09:31:36

冒号是Ruby中符号的一部分,通过调用对象上的to_proc并将其作为块使用,&是使该语法工作的神奇之处。因此,虽然不能使用像:drop(1)这样的符号,但是可以通过两种方式实现这一点而不需要使用符号:

1)从方法中返回proc并将其传递给:

代码语言:javascript
复制
def drop(count)
  proc { |instance| instance.drop(count) }
end
a.collect(&drop(1))

2)传入响应to_proc的对象

代码语言:javascript
复制
class Drop
  def initialize(how_many = 1)
    @to_drop = how_many
  end

  def to_proc
    proc { |instance| instance.drop(@to_drop) } 
  end
end
drop = Drop.new(1)
a.collect(&drop) # or, more succinctly
a.collect(&Drop.new(1))

在这样一个简单的例子中,定义返回响应to_proc的过程或对象的方法可能是过分的,只将一个块传递给collect更好,但是可能有一些用例没有。

更新:考虑到这一点,Symbol类没有call方法,但这并不意味着它不能:

代码语言:javascript
复制
module SymbolCall
  def call(*args)
    proc { |instance| instance.public_send(self, *args) }
  end
end

class Symbol
  include SymbolCall
end

a.collect(&:drop.(1)) # or
a.collect(&:drop.call(1))

请确保不要忘记,它实际上是一个名为:drop.(1) 而不是 :drop(1)的方法。

票数 6
EN

Stack Overflow用户

发布于 2017-09-17 09:02:03

不,这不可能。

&语法是语法糖,它实际上是这样做的:

  • 将参数转换为Proc实例,并对其调用to_proc
  • 将proc用作块,将参数从枚举数传递给它。

(&:foo)之所以有效,是因为Symbol.to_proc存在。

(&:foo(arg))只是不能被解析,因为:需要后面的有效符号字符,并且打开括号会引发语法错误。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46262302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档