我不明白。 这个有效:
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'在第二种形式和第三种形式之间。 那是为什么?
答案 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