Désolé pour la question noob, mais que signifie cet astérisque au début d'une plage?
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
3 Réponses :
* décompresse un tableau en "splattant" son contenu et en le convertissant en tableau.
Comme il est indiqué dans la documentation :
Vous pouvez transformer un
Arrayen une liste d'arguments avec l'opérateur*(ou splat):[*1..3] #â [1, 2, 3]
La même chose pourrait être faite pour Range:
arguments = 1..3 my_method(*arguments) # essentially the same as my_method(1, 2, 3)
L'opérateur splat est également autorisé avant les plages à l'intérieur de la déclaration du tableau de manière implicite convertir Range en Array:
arguments = [1, 2, 3] my_method(*arguments)
Comme indiqué par les autres réponses, l'opérateur * est utilisé pour transformer un tableau en une liste d'arguments.
Mais que faire si l'objet n'est pas un tableau, comme dans votre cas? Ensuite, Ruby appellera #to_a sur l'objet, s'il est défini, et utilisera le tableau retourné à la place. Sinon, l'objet lui-même est utilisé.
Voici le cas où l'objet n'est ni un tableau ni ne définit #to_a:
NilClass.undef_method(:to_a) say_hi(*name) # prints "Hi, "
c'est l'opérateur splat. Voir blog.honeybadger.io/ruby-splat-array-manipulation-destructur ing
L'opérateur Splat «désplate» le
Rangecomme il le fait pourArray:[* 0..1] # ⇒ [0, 1].