首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在一个范围的开始,什么意思?

在一个范围的开始,什么意思?
EN

Stack Overflow用户
提问于 2019-04-28 08:29:50
回答 3查看 362关注 0票数 1

对不起,这个星号在一个范围的开头意味着什么?

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-28 09:00:55

如所述,在文件中

可以将Array转换为带有* (或splat)运算符的参数列表: 参数= 1,2,3 my_method(*参数)

对于Range也可以这样做。

代码语言:javascript
复制
arguments = 1..3
my_method(*arguments) # essentially the same as my_method(1, 2, 3)

此外,在数组声明中的范围之前允许splat运算符隐式地将Range转换为Array

代码语言:javascript
复制
[*1..3]
#⇒ [1, 2, 3]
票数 3
EN

Stack Overflow用户

发布于 2019-04-28 08:32:28

*通过“抛出”数组内容并将其转换为数组来解压数组。

票数 1
EN

Stack Overflow用户

发布于 2019-04-28 09:41:57

正如其他答案所述,*运算符用于将数组转换为参数列表。

但是,如果对象不是数组,就像在您的例子中那样呢?然后,Ruby将调用对象上的#to_a (如果定义的话),并使用返回的数组。否则,将使用对象本身。

下面是对象既不是数组也不定义#to_a的情况

代码语言:javascript
复制
x = *4 # => [4]

如果对象定义了#to_a,就会调用和使用它,就像Range那样

代码语言:javascript
复制
x = *0..1 # => [0, 1]

为了证明这一点,我们可以添加一个模块来跟踪对#to_a的调用。

代码语言:javascript
复制
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

我们也可以在我们的自定义类型中使用这个:

代码语言:javascript
复制
class Foo
  def to_a
    [1, 2, 3]
  end
end

x = *Foo.new # => [1, 2, 3]

顺便说一下,Ruby的nil也实现了#to_a。这允许我们将nil作为参数传递,就好像没有传递任何内容一样,因为nil.to_a返回[]

代码语言:javascript
复制
def count(*args)
  args.count
end

count # => 0
count(*0..1) # => 2
count(*nil) # => 0

当您有一个可以是nil的变量传递给具有默认值的方法时,这可能很有用:

代码语言:javascript
复制
def say_hi(name = "Jane")
  puts "Hi, #{name}"
end

name = nil
say_hi(*name) # prints "Hi, Jane"

但如果我们去掉NilClass#to_a

代码语言:javascript
复制
NilClass.undef_method(:to_a)

say_hi(*name) # prints "Hi, "
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55888413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档