Skip to content

Commit

Permalink
Make Chars#slice! behave more like String#slice! [#1243 state:resolved]
Browse files Browse the repository at this point in the history
- Chars#slice! now returns the slice instead of itself
- Chars#slice! now removes the slice from itself

Signed-off-by: Pratik Naik <pratiknaik@gmail.com>
  • Loading branch information
oggy authored and lifo committed Mar 7, 2009
1 parent ea8488c commit 7438788
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 7 deletions.
16 changes: 14 additions & 2 deletions activesupport/lib/active_support/multibyte/chars.rb
Expand Up @@ -344,7 +344,19 @@ def slice(*args)
end
alias_method :[], :slice

# Converts first character in the string to Unicode value
# Like <tt>String#slice!</tt>, except instead of byte offsets you specify character offsets.
#
# Example:
# s = 'こんにちは'
# s.mb_chars.slice!(2..3).to_s #=> "にち"
# s #=> "こんは"
def slice!(*args)
slice = self[*args]
self[*args] = ''
slice
end

# Returns the codepoint of the first character in the string.
#
# Example:
# 'こんにちは'.mb_chars.ord #=> 12371
Expand Down Expand Up @@ -432,7 +444,7 @@ def tidy_bytes
chars(self.class.tidy_bytes(@wrapped_string))
end

%w(lstrip rstrip strip reverse upcase downcase slice tidy_bytes capitalize).each do |method|
%w(lstrip rstrip strip reverse upcase downcase tidy_bytes capitalize).each do |method|
define_method("#{method}!") do |*args|
unless args.nil?
@wrapped_string = send(method, *args).to_s
Expand Down
14 changes: 9 additions & 5 deletions activesupport/test/multibyte_chars_test.rb
Expand Up @@ -123,7 +123,6 @@ def test_overridden_bang_methods_return_self
[:rstrip!, :lstrip!, :strip!, :reverse!, :upcase!, :downcase!, :capitalize!].each do |method|
assert_equal @chars.object_id, @chars.send(method).object_id
end
assert_equal @chars.object_id, @chars.slice!(1).object_id
end

def test_overridden_bang_methods_change_wrapped_string
Expand All @@ -133,10 +132,6 @@ def test_overridden_bang_methods_change_wrapped_string
proxy.send(method)
assert_not_equal original, proxy.to_s
end
proxy = chars('Café')
proxy.slice!(3)
assert_equal 'é', proxy.to_s

proxy = chars('òu')
proxy.capitalize!
assert_equal 'Òu', proxy.to_s
Expand Down Expand Up @@ -391,6 +386,15 @@ def test_slice_should_take_character_offsets
assert_equal nil, @chars.slice(7..6)
end

def test_slice_bang_returns_sliced_out_substring
assert_equal 'にち', @chars.slice!(1..2)
end

def test_slice_bang_removes_the_slice_from_the_receiver
@chars.slice!(1..2)
assert_equal 'こわ', @chars
end

def test_slice_should_throw_exceptions_on_invalid_arguments
assert_raise(TypeError) { @chars.slice(2..3, 1) }
assert_raise(TypeError) { @chars.slice(1, 2..3) }
Expand Down

0 comments on commit 7438788

Please sign in to comment.