1
votes

Que signifie * au début d'une plage?

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


2 commentaires

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 pour Array : [* 0..1] # ⇒ [0, 1] .


3 Réponses :


1
votes

* décompresse un tableau en "splattant" son contenu et en le convertissant en tableau.


0 commentaires

3
votes

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)


0 commentaires

1
votes

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, "


0 commentaires