# Extending String call with a #copy!(n)

**URL:** <https://www.ruby-forum.com/t/extending-string-call-with-a-copy-n/64652>\
**Category:** Ruby\
**Created:** [August 15, 2006, 2:13pm UTC](https://www.ruby-forum.com/t/extending-string-call-with-a-copy-n/64652 "2006-08-15T14:13:03Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [August 15, 2006, 2:13pm UTC](https://www.ruby-forum.com/t/extending-string-call-with-a-copy-n/64652/1 "2006-08-15T14:13:03Z")

</div>

i’ve allready extendy String class by a #copy(n) like that :

class String  
def copy(n)  
out=""  
(1…n).each {|i| out+=self}  
return out  
end  
end

however i’d like to extend also String with a #copy!(n) (in place which  
would work like that :

“\*”.copy!(4)

# =\> “\*\*\*\*”

the prob is to affect self ???

---

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [August 15, 2006, 2:13pm UTC](https://www.ruby-forum.com/t/extending-string-call-with-a-copy-n/64652/2 "2006-08-15T14:13:04Z")

</div>

Une bévue wrote:

> however i’d like to extend also String with a #copy!(n) (in place which  
> would work like that :
> 
> “\*”.copy!(4)
> 
> # =\> “\*\*\*\*”
> 
> the prob is to affect self ???

Use \<\< (or concat).

---

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [August 15, 2006, 2:13pm UTC](https://www.ruby-forum.com/t/extending-string-call-with-a-copy-n/64652/3 "2006-08-15T14:13:06Z")

</div>

Alex Y. wrote:

> > however i’d like to extend also String with a #copy!(n) (in place which  
> > would work like that :
> > 
> > “\*”.copy!(4)
> > 
> > # =\> “\*\*\*\*”
> > 
> > the prob is to affect self ???
> 
> Use \<\< (or concat).

or sub!.

class String  
def copy!(n)  
self.sub!(self, self\*n)  
end  
end

---

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [August 15, 2006, 2:13pm UTC](https://www.ruby-forum.com/t/extending-string-call-with-a-copy-n/64652/4 "2006-08-15T14:13:08Z")

</div>

Alex Y. wrote:

> > Use \<\< (or concat).
> 
> or sub!.

replace would be more efficient:  
class String  
alias copy \*  
def copy!(n)  
replace(self\*n)  
end  
end

---

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [August 15, 2006, 2:13pm UTC](https://www.ruby-forum.com/t/extending-string-call-with-a-copy-n/64652/5 "2006-08-15T14:13:08Z")

</div>

Daniel DeLorme wrote:

> end  
> end

Oh yes. So it would 🙂

---

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [August 15, 2006, 2:13pm UTC](https://www.ruby-forum.com/t/extending-string-call-with-a-copy-n/64652/6 "2006-08-15T14:13:11Z")

</div>

Daniel DeLorme [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> alias copy \*

with is the reason for this line ???

---

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [August 15, 2006, 2:13pm UTC](https://www.ruby-forum.com/t/extending-string-call-with-a-copy-n/64652/7 "2006-08-15T14:13:20Z")

</div>

Une bévue wrote:

> Daniel DeLorme [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:
> 
> > alias copy \*
> 
> with is the reason for this line ???

Your copy method produces identical results to the String#\* method. For  
example:

irb(main):001:0\> a = “foo”  
=\> “foo”  
irb(main):002:0\> a \* 3  
=\> “foofoofoo”

---

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [August 15, 2006, 2:14pm UTC](https://www.ruby-forum.com/t/extending-string-call-with-a-copy-n/64652/8 "2006-08-15T14:14:16Z")

</div>

Alex Y. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Your copy method produces identical results to the String#\* method. For  
> example:
> 
> irb(main):001:0\> a = “foo”  
> =\> “foo”  
> irb(main):002:0\> a \* 3  
> =\> “foofoofoo”

OK, fine, thanxs, i even didn’t notice the ruby facility upon String  
multiplication 😉

---

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [August 15, 2006, 2:13pm UTC](https://www.ruby-forum.com/t/extending-string-call-with-a-copy-n/64652/9 "2006-08-15T14:13:11Z")

</div>

Alex Y. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Oh yes. So it would 🙂

thanxs to all !
