ruby class#初始化流形参数

时间:2014-10-22 11:13:41

标签: ruby ruby-2.1.3

我不明白。 这个有效:

class Foo
  def initialize(*args)
    @variables = *args unless args[0].eql?(nil)
  end
end

这个人不要:

class Foo
  def initialize(*args)
    args[0].eql?(nil) ? @multiples = [3,5] : @multiples = *args
  end
end

但这个也有效:

class Foo
  def initialize(*args)
    args[0].eql?(nil) ? @multiples = [3,5] : @multiples = args
  end
end

我的问题是关于' args'和' * args'在第二种形式和第三种形式之间。 那是为什么?

1 个答案:

答案 0 :(得分:2)

如您所知,splat运算符(星号*)在方法定义中使用时,将捕获无限数量的参数并将它们转换为数组。然而,当在METHOD体中使用时,其目的是不同的。因为

,在执行赋值时将splat *放在方法体中是没有意义的

a)你会得到与你没有把它相同的结果。

class Foo
  def initialize(*args)
    @a = args
    @b = *args
    p @a == @b
  end
end

Foo.new(1,2,3) #=> prints 'true'

b)你会得到类似第二个例子中的奇怪错误,这可能会产生错误,因为Ruby会混淆运算符的优先级。但是,如果你在整个表达式中加上括号,它将起作用:

class Foo
  def initialize(*args)
    args[0].eql?(nil) ? @multiples = [3,5] : (@multiples = *args)
  end
end

总而言之,在对变量进行splat赋值时,请不要使用*。

顺便说一句,有点偏离主题,而不是args[0].eql?(nil),你可以只do arg[0].nil?而且,不是两次分配@multiples,你可以这样做:

@multiples = args[0].nil? ? [3,5] : args