对不起,这个星号在一个范围的开头意味着什么?
class Matrix
def initialize(matrix_string)
@matrix = matrix_string.split("\n").map do |row|
row.split.map(&:to_i)
end
@rows = rows.length
@cols = columns.length
end
def rows
@matrix
end
def columns
@matrix.transpose
end
# --->>***
def saddle_points
[*0...@rows].product([*0...@cols]).select do |coords|
saddle_point?(*coords)
end
# ***<----
end
private
def saddle_point?(row, col)
(@matrix[row][col] == rows[row].max) &&
(@matrix[row][col] == columns[col].min)
end
end发布于 2019-04-28 09:00:55
如所述,在文件中
可以将
Array转换为带有*(或splat)运算符的参数列表: 参数= 1,2,3 my_method(*参数)
对于Range也可以这样做。
arguments = 1..3
my_method(*arguments) # essentially the same as my_method(1, 2, 3)此外,在数组声明中的范围之前允许splat运算符隐式地将Range转换为Array。
[*1..3]
#⇒ [1, 2, 3]发布于 2019-04-28 08:32:28
*通过“抛出”数组内容并将其转换为数组来解压数组。
发布于 2019-04-28 09:41:57
正如其他答案所述,*运算符用于将数组转换为参数列表。
但是,如果对象不是数组,就像在您的例子中那样呢?然后,Ruby将调用对象上的#to_a (如果定义的话),并使用返回的数组。否则,将使用对象本身。
下面是对象既不是数组也不定义#to_a的情况
x = *4 # => [4]如果对象定义了#to_a,就会调用和使用它,就像Range那样
x = *0..1 # => [0, 1]为了证明这一点,我们可以添加一个模块来跟踪对#to_a的调用。
module Trace
def to_a
puts "#to_a called"
super
end
end
Range.prepend(Trace)
x = *0..1
# prints "#to_a called"
# => [0, 1]注意,如果您的对象已经是#to_a类型,Ruby将不会调用Array。
我们也可以在我们的自定义类型中使用这个:
class Foo
def to_a
[1, 2, 3]
end
end
x = *Foo.new # => [1, 2, 3]顺便说一下,Ruby的nil也实现了#to_a。这允许我们将nil作为参数传递,就好像没有传递任何内容一样,因为nil.to_a返回[]。
def count(*args)
args.count
end
count # => 0
count(*0..1) # => 2
count(*nil) # => 0当您有一个可以是nil的变量传递给具有默认值的方法时,这可能很有用:
def say_hi(name = "Jane")
puts "Hi, #{name}"
end
name = nil
say_hi(*name) # prints "Hi, Jane"但如果我们去掉NilClass#to_a
NilClass.undef_method(:to_a)
say_hi(*name) # prints "Hi, "https://stackoverflow.com/questions/55888413
复制相似问题