首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何传递来自Array#sample的参数!Array#sample方法

如何传递来自Array#sample的参数!Array#sample方法
EN

Stack Overflow用户
提问于 2021-12-08 17:07:46
回答 1查看 82关注 0票数 -2

我正在修改Array类以添加一个Array#sample!方法:

  • Array#sample!应该是Array#sample的破坏性版本,它从数组中删除返回的元素。

  • Array#sample!应该使用与Array#sample.

相同的参数

然而,我未能正确地传递论点。以下是我所尝试的:

代码语言:javascript
复制
class Array
  def sample!(n = nil, **args)
    if n
      self.sample(n, args).map { |e| self.delete(e) }
    else
      self.delete(self.sample(args))
    end
  end
end

a = (1..10).to_a

p a.sample
p a.sample(4)
p a.sample(random: Random.new(1))
p a.sample(4, random: Random.new(1))

p a.sample!
p a.sample!(4)
p a.sample!(random: Random.new(1))
p a.sample!(4, random: Random.new(1))

no implicit conversion of Hash into Integer消息失败:o(

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-09 10:45:54

让我们从传递参数开始。您可以这样做:( splat (*)实际上省略了位置参数,如果nnil)

代码语言:javascript
复制
class Array
  def my_sample(n = nil, **kwargs)
    sample(*n, **kwargs)
  end
end

[1, 2, 3].my_sample #=> 3
[1, 2, 3].my_sample(2) #=> [1, 3]
[1, 2, 3].my_sample(random: Random.new(1)) #=> 2
[1, 2, 3].my_sample(2, random: Random.new(1)) #=> [2, 3]

或者你可以用一个条件:

代码语言:javascript
复制
class Array
  def my_sample(n = nil, **kwargs)
    if n
      sample(n, **kwargs)
    else
      sample(**kwargs)
    end
  end
end

实现一个sample!方法,它的工作方式与sample类似,但它也删除了这些元素,这可能比您的方法要复杂一些。

由于数组可以多次包含相同的元素,因此必须特别注意删除正确的元素。(你不能只删除所有的副本,既不是任意的)

像这样的东西可能会起作用:

代码语言:javascript
复制
class Array
  def sample!(n = nil, **kwargs)
    indices = (0...size).to_a
    if n
      samples = indices.sample(n, **kwargs)
      remaining = indices - samples
      return_value = values_at(*samples)
    else
      sample = indices.sample(**kwargs)
      remaining = indices - [sample]
      return_value = at(sample)
    end
    replace(values_at(*remaining))
    return_value
  end
end

在这里,我创建了一个索引数组(保证它是唯一的),并从该数组中进行示例。然后确定其余的索引(这只是差异),设置返回值并调整数组内容。

您可以统一这两种代码路径,但这会使代码更难阅读。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70279007

复制
相关文章

相似问题

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