Skip to content
This repository
tree: 074359dfa8
Fetching contributors…

Cannot retrieve contributors at this time

file 97 lines (92 sloc) 2.782 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
require 'active_support/multibyte'

class String
  # If you pass a single Fixnum, returns a substring of one character at that
  # position. The first character of the string is at position 0, the next at
  # position 1, and so on. If a range is supplied, a substring containing
  # characters at offsets given by the range is returned. In both cases, if an
  # offset is negative, it is counted from the end of the string. Returns nil
  # if the initial offset falls outside the string. Returns an empty string if
  # the beginning of the range is greater than the end of the string.
  #
  # str = "hello"
  # str.at(0) #=> "h"
  # str.at(1..3) #=> "ell"
  # str.at(-2) #=> "l"
  # str.at(-2..-1) #=> "lo"
  # str.at(5) #=> nil
  # str.at(5..-1) #=> ""
  #
  # If a Regexp is given, the matching portion of the string is returned.
  # If a String is given, that given string is returned if it occurs in
  # the string. In both cases, nil is returned if there is no match.
  #
  # str = "hello"
  # str.at(/lo/) #=> "lo"
  # str.at(/ol/) #=> nil
  # str.at("lo") #=> "lo"
  # str.at("ol") #=> nil
  def at(position)
    self[position]
  end

  # Returns a substring from the given position to the end of the string.
  # If the position is negative, it is counted from the end of the string.
  #
  # str = "hello"
  # str.from(0) #=> "hello"
  # str.from(3) #=> "lo"
  # str.from(-2) #=> "lo"
  #
  # You can mix it with +to+ method and do fun things like:
  #
  # str = "hello"
  # str.from(0).to(-1) #=> "hello"
  # str.from(1).to(-2) #=> "ell"
  def from(position)
    self[position..-1]
  end

  # Returns a substring from the beginning of the string to the given position.
  # If the position is negative, it is counted from the end of the string.
  #
  # str = "hello"
  # str.to(0) #=> "h"
  # str.to(3) #=> "hell"
  # str.to(-2) #=> "hell"
  #
  # You can mix it with +from+ method and do fun things like:
  #
  # str = "hello"
  # str.from(0).to(-1) #=> "hello"
  # str.from(1).to(-2) #=> "ell"
  def to(position)
    self[0..position]
  end

  # Returns the first character of the string. If a limit is supplied,
  # returns a substring from the beginning of the string to the given
  # limit. If the given limit is greater than or equal to the string
  # length, returns self.
  #
  # str = "hello"
  # str.first #=> "h"
  # str.first(1) #=> "h"
  # str.first(2) #=> "he"
  # str.first(0) #=> ""
  # str.first(6) #=> "hello"
  def first(limit = 1)
    if limit == 0
      ''
    elsif limit >= size
      self
    else
      to(limit - 1)
    end
  end

  def last(limit = 1)
    if limit == 0
      ''
    elsif limit >= size
      self
    else
      from(-limit)
    end
  end
end
Something went wrong with that request. Please try again.