好的,我知道Ruby拥有丰富的各种允许从数组中删除的方法,例如shift,pop,delete,drop等。
但是如果你试图在不使用这些方法的情况下重写方法,那么如何弄清楚如何从数组中删除元素?
如果有一个数组,请说a = [10, 2, 7, 5]
并且您要从中移除2个元素,a[0]
和a[1]
,如drop method,这是如何完成的?
么?
修改
对不起,本来应该更清楚一点 - 我试图在没有 Array或Enumerable库的任何方法的情况下执行此操作。
编辑两个
哇,这么多评论! =)再次,我道歉。我一直忘记提到我允许自己使用的唯一方法是尺寸。但除此之外,我已经开始的整个练习(阅读,疯狂的帽子计划)实际上对我个人而言非常有教育意义。它迫使我真正理解这些方法背后发生的事情。对不起,除了我在这里所说的之外,我不知道如何进一步澄清这个问题。
我意识到虽然这个问题可能不是最好的时间效率,因为Ruby确实有很棒的方法,但我要求一个理由,那就是,这是我自己的启示,我需要帮助搞清楚件等。
如果还有其他什么我可以进一步了解,请问。否则,感谢所有回复的人!真的很谢谢你。
答案 0 :(得分:0)
您可以使用delete_at方法,
删除指定索引处的元素,返回该元素或 如果指数超出范围,则为零。
答案 1 :(得分:0)
你的意思是Ruby本身如何实现它?点击"点击切换来源"将鼠标悬停在您链接的页面中的功能说明上时显示的按钮。你是说没有drop
,shift
或delete
你将如何完成?使用slice!
。或者你的意思是即使没有它?循环元素并将它们一个接一个地移动,但这很难快速。
编辑:"没有来自数组或可枚举库的任何方法":如果没有Array
的任何方法,您无法执行此操作,因为任何与Array
将Array
中的方法。除了Array
,[]
和[]=
(以及size
之外的任何new
方法,此代码都会执行此操作(或非常接近它的方法) {1}}):
diy_drop
对于class Array
def diy_drop!(x)
new_size = size - x
size.times do |i|
self[i] = i < new_size ? self[i + x] : nil
end
self
end
def diy_drop(x)
result = []
(size - x).times do |i|
result[i] = self[i + x]
end
result
end
end
,这是你能得到的最接近的;数组将留下一些dangly diy_drop!
,因为除了你想要实现的方法之外,没有办法调整nil
的大小。这不是Array
的问题,因为它会创建一个新数组。
diy_drop
你也可以&#34;作弊&#34;并将a = [1, 2, 3, 4, 5]
a.diy_drop(2)
# => [3, 4, 5]
a
# => [1, 2, 3, 4, 5]
a.diy_drop!(2)
# => [3, 4, 5, nil, nil]
a
# => [3, 4, 5, nil, nil]
和[]
方法与范围参数一起使用:
[]=
(我说&#34;作弊&#34;因为使用它们几乎相当于使用各种删除/切片功能。)
答案 2 :(得分:0)
我确切地知道你的意思:使用Array
和Enumerable
方法会变得非常无聊。不幸的是,对于数组而言,我不认为你可以做你想做的事情,而不使用该类或该模块中的至少一种方法。
但是,如果数组的所有元素都是字符串,那么就有办法。如果是我厌倦了Array
和Enumerable
方法的那一天,我会使用Object#to_enum,Enumerator#next,{{ 3}}和三个String
方法:
a = ["a","b","c","d","e"]
enum = a.to_enum
enum.next
enum.next
str = ''
loop do
s = enum.next
str << "#{s} "
end
str.split
#=> ["c", "d", "e"]
当然,Array
包含Object
方法,但这不算数。
答案 3 :(得分:-1)
试试这个:
class Array
def my_drop_method(i)
self[i..self.size]
end
end
现在使用这种方法:
a = [10, 2, 7, 5]
a.my_drop_method(2)
=> [7, 5]
self
是context
中的当前对象。
这里my_drop_method
实例方法self等于[10,2,7,5],即a
。
试试这个:
根据您更新的问题,这是新答案:
a = [10, 2, 7, 5]
=> [10, 2, 7, 5]
n = 2 // number of elements to remove
=> 2
r = Regexp.new('\d+,' * n)
=> /\d+,\d+,/
a.to_s.gsub(/\[|\]|\s/,'').match(r).post_match.split(',')
=> ["7", "5"]