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
Array
en 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
Range
comme il le fait pourArray
:[* 0..1] # ⇒ [0, 1]
.