我正在修改Array类以添加一个Array#sample!方法:
Array#sample!应该是Array#sample的破坏性版本,它从数组中删除返回的元素。Array#sample!应该使用与Array#sample.相同的参数
然而,我未能正确地传递论点。以下是我所尝试的:
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(
发布于 2021-12-09 10:45:54
让我们从传递参数开始。您可以这样做:( splat (*)实际上省略了位置参数,如果n是nil)
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]或者你可以用一个条件:
class Array
def my_sample(n = nil, **kwargs)
if n
sample(n, **kwargs)
else
sample(**kwargs)
end
end
end实现一个sample!方法,它的工作方式与sample类似,但它也删除了这些元素,这可能比您的方法要复杂一些。
由于数组可以多次包含相同的元素,因此必须特别注意删除正确的元素。(你不能只删除所有的副本,既不是任意的)
像这样的东西可能会起作用:
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在这里,我创建了一个索引数组(保证它是唯一的),并从该数组中进行示例。然后确定其余的索引(这只是差异),设置返回值并调整数组内容。
您可以统一这两种代码路径,但这会使代码更难阅读。
https://stackoverflow.com/questions/70279007
复制相似问题