【问题标题】:How to access a Ruby splat argument?如何访问 Ruby splat 参数?
【发布时间】:2020-01-02 12:27:38
【问题描述】:

我已经覆盖了我的设计 gem 中的 send_devise_notification 方法。

我需要访问*args 数组中的第一个元素,我认为这可以通过*args[0] 来实现。

我期待一个字符串,但请查看下面的奇怪输出:

class User
  include Mongoid::Document

  devise :confirmable, :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :lockable

  protected

    def send_devise_notification(notification, *args)
      p *args.inspect               # => ["auNsGzsnpoQWtAk2Z1Tr", {}]
      p *args[0].inspect            # => "auNsGzsnpoQWtAk2Z1Tr"
      p *args[0].class.to_s.inspect # => "String"
      token = *args[0]
      p token.inspect               # => ["auNsGzsnpoQWtAk2Z1Tr"]
      p token.class.to_s.inspect    # => "Array"
    end
end

当我记录它时,我看到一个字符串。但是当我将它放入 token 变量时,我看到了一个数组。而且我无法将变量转换为字符串。我试过token.to_s等。

知道发生了什么吗?

【问题讨论】:

  • 你可以使用 args.first 来获取第一个元素 @johnsmith1976 是 *args 是一个数组

标签: ruby-on-rails arrays ruby devise splat


【解决方案1】:

你应该使用args,它是一个数组:

def a(*args)
   args.each {|e| puts "-- #{e}" }
end  

a(1,2,3,4)
#-- 1
#-- 2
#-- 3
#-- 4
#=> [1, 2, 3, 4]

因此,如果您想获取它的第一个元素 - 调用 args[0]args.first(不带前导星号)。

【讨论】:

  • 是的,您只在方法定义和方法调用中使用一元 * 运算符。
【解决方案2】:

您可以使用args.first 获取第一个元素,因为*args 是一个数组。

【讨论】:

    猜你喜欢
    • 2011-07-13
    • 2013-03-25
    • 2017-12-14
    • 2017-08-08
    • 2015-02-23
    • 1970-01-01
    • 2014-10-25
    • 2017-06-11
    • 2013-05-14
    相关资源
    最近更新 更多