Class: IO (Ruby 2.4.2)
Description: Class : IO - Ruby 2.4.2

Support for the Ruby 2.4 series has ended. See here for reference.

### Home Classes Methods

### In Files

- scanf.rb

### Parent

Object

### Methods

- #scanf

### Class/Module Index

Quicksearch

- IO
- Kernel
- Scanf
- String

No matching classes.

# IO

### Public Instance Methods

scanf(str) click to toggle source

Scans the current string until the match is exhausted, yielding each match as it is encountered in the string. A block is not necessary though, as the results will simply be aggregated into the final array.

    "123 456".block_scanf("%d")
    # => [123, 456]

If a block is given, the value from that is returned from the yield is added to an output array.

    "123 456".block_scanf("%d") do |digit,| # the ',' unpacks the Array
      digit + 100
    end
    # => [223, 556]

See `Scanf` for details on creating a format string.

You will need to require 'scanf' to use `IO#scanf`.

                   # File scanf.rb, line 614
    def scanf(str,&b) #:yield: current_match
      return block_scanf(str,&b) if b
      return [] unless str.size > 0

      start_position = pos rescue 0
      matched_so_far = 0
      source_buffer = ""
      result_buffer = []
      final_result = []

      fstr = Scanf::FormatString.new(str)

      loop do
        if eof || (tty? &&! fstr.match(source_buffer))
          final_result.concat(result_buffer)
          break
        end

        source_buffer << gets

        current_match = fstr.match(source_buffer)

        spec = fstr.last_spec_tried

        if spec.matched
          if spec.mid_match?
            result_buffer.replace(current_match)
            next
          end

        elsif (fstr.matched_count == fstr.spec_count - 1)
          if /\A\s*\z/.match(fstr.string_left)
            break if spec.count_space?
            result_buffer.replace(current_match)
            next
          end
        end

        final_result.concat(current_match)

        matched_so_far += source_buffer.size
        source_buffer.replace(fstr.string_left)
        matched_so_far -= source_buffer.size
        break if fstr.last_spec
        fstr.prune
      end

      begin
        seek(start_position + matched_so_far, IO::SEEK_SET)
      rescue Errno::ESPIPE
      end

      soak_up_spaces if fstr.last_spec && fstr.space

      return final_result
    end