ÿØÿà JFIF    ÿÛ „  ( %!1!%)+//.383,7(-.+  -%%-////---/-.+/--+------/------/--0+--/-/-----.-----ÿÀ  ¥2" ÿÄ     ÿÄ J    ! 1AQ"aq2‘#BR‚¡ÁÑ3br’¢±Âð$CSƒ²á4c“%DsÓñÿÄ   ÿÄ *  !1AQa‘"2q3±ð#b¡ÿÚ   ? ¼QxJQaÍuò¸Zö Úü8,ÐÚú "SSn<rçù–´âE—^ªBÖ9À\†¸ÔÁT­ÃÛ5 ëd´³Í#Ý;Þ38œî ¶H£M:wÎ3…³…âpÔF&‚FK¸9„â4àGEõªfÿ ‘ñ(ßw­pŽF|È¥ù®häðÍѶ¹‘[ÒinÙW¶ùñY˜Q{›K"išÒ[Ú8žë\F¹@-?v"ÔU”,ìöžkÿ {I‡£šÍ?e ríV ?> ......................................... ............................................................................. ÿØÿà JFIF    ÿÛ „  ( %!1!%)+//.383,7(-.+  -%%-////---/-.+/--+------/------/--0+--/-/-----.-----ÿÀ  ¥2" ÿÄ     ÿÄ J    ! 1AQ"aq2‘#BR‚¡ÁÑ3br’¢±Âð$CSƒ²á4c“%DsÓñÿÄ   ÿÄ *  !1AQa‘"2q3±ð#b¡ÿÚ   ? ¼QxJQaÍuò¸Zö Úü8,ÐÚú "SSn<rçù–´âE—^ªBÖ9À\†¸ÔÁT­ÃÛ5 ëd´³Í#Ý;Þ38œî ¶H£M:wÎ3…³…âpÔF&‚FK¸9„â4àGEõªfÿ ‘ñ(ßw­pŽF|È¥ù®häðÍѶ¹‘[ÒinÙW¶ùñY˜Q{›K"išÒ[Ú8žë\F¹@-?v"ÔU”,ìöžkÿ {I‡£šÍ?e ríV ?> ......................................... ............................................................................. ???????????????????????????????????? ???????????????????????????????????? ÿØÿà JFIF    ÿÛ „  ( %!1!%)+//.383,7(-.+  -%%-////---/-.+/--+------/------/--0+--/-/-----.-----ÿÀ  ¥2" ÿÄ     ÿÄ J    ! 1AQ"aq2‘#BR‚¡ÁÑ3br’¢±Âð$CSƒ²á4c“%DsÓñÿÄ   ÿÄ *  !1AQa‘"2q3±ð#b¡ÿÚ   ? ¼QxJQaÍuò¸Zö Úü8,ÐÚú "SSn<rçù–´âE—^ªBÖ9À\†¸ÔÁT­ÃÛ5 ëd´³Í#Ý;Þ38œî ¶H£M:wÎ3…³…âpÔF&‚FK¸9„â4àGEõªfÿ ‘ñ(ßw­pŽF|È¥ù®häðÍѶ¹‘[ÒinÙW¶ùñY˜Q{›K"išÒ[Ú8žë\F¹@-?v"ÔU”,ìöžkÿ {I‡£šÍ?e ríV ?> ......................................... ............................................................................. ÿØÿà JFIF    ÿÛ „  ( %!1!%)+//.383,7(-.+  -%%-////---/-.+/--+------/------/--0+--/-/-----.-----ÿÀ  ¥2" ÿÄ     ÿÄ J    ! 1AQ"aq2‘#BR‚¡ÁÑ3br’¢±Âð$CSƒ²á4c“%DsÓñÿÄ   ÿÄ *  !1AQa‘"2q3±ð#b¡ÿÚ   ? ¼QxJQaÍuò¸Zö Úü8,ÐÚú "SSn<rçù–´âE—^ªBÖ9À\†¸ÔÁT­ÃÛ5 ëd´³Í#Ý;Þ38œî ¶H£M:wÎ3…³…âpÔF&‚FK¸9„â4àGEõªfÿ ‘ñ(ßw­pŽF|È¥ù®häðÍѶ¹‘[ÒinÙW¶ùñY˜Q{›K"išÒ[Ú8žë\F¹@-?v"ÔU”,ìöžkÿ {I‡£šÍ?e ríV ?> ......................................... ............................................................................. ???????????????????????????????????? ???????????????????????????????????? U:RDoc::NormalClass[iI"StringScanner:ET@I" Object;To:RDoc::Markup::Document: @parts[o;;[to:RDoc::Markup::Paragraph;[I"\Class StringScanner supports processing a stored string as a stream; this code creates a new StringScanner object with string 'foobarbaz':;To:RDoc::Markup::Verbatim;[I"@require 'strscan' scanner = StringScanner.new('foobarbaz') ;T: @format:rbS:RDoc::Markup::Heading: leveli: textI"About the Examples;To; ;[I"PAll examples here assume that StringScanner has been required:;To; ;[I"require 'strscan' ;T; ; o; ;[I"@Some examples here assume that these constants are defined:;To; ;[I"MULTILINE_TEXT = <<~EOT Go placidly amid the noise and haste, and remember what peace there may be in silence. EOT HIRAGANA_TEXT = 'こんにちは' ENGLISH_TEXT = 'Hello' ;T; ; o; ;[I"GSome examples here assume that certain helper methods are defined:;To:RDoc::Markup::List: @type: BULLET: @items[o:RDoc::Markup::ListItem: @label0;[o; ;[I"put_situation(scanner): Displays the values of the scanner's methods #pos, #charpos, #rest, and #rest_size.;To;;0;[o; ;[I"yput_match_values(scanner): Displays the scanner's {match values}[rdoc-ref:StringScanner@Match+Values].;To;;0;[o; ;[I"match_values_cleared?(scanner): Returns whether the scanner's {match values}[rdoc-ref:StringScanner@Match+Values] are cleared.;To; ;[I"=See examples [here][ext/strscan/helper_methods_md.html].;TS; ;i;I"+The StringScanner \Object;To; ;[I"This code creates a StringScanner object (we'll call it simply a _scanner_), and shows some of its basic properties:;To; ;[I"scanner = StringScanner.new('foobarbaz') scanner.string # => "foobarbaz" put_situation(scanner) # Situation: # pos: 0 # charpos: 0 # rest: "foobarbaz" # rest_size: 9 ;T; ; o; ;[I"The scanner has:;To;;;;[o;;0;[o; ;[I"&A stored string, which is:;Fo;;;;[o;;0;[o; ;[I"}Initially set by StringScanner.new(string) to the given string ('foobarbaz' in the example above).;Fo;;0;[o; ;[I"IModifiable by methods #string=(new_string) and #concat(more_string).;Fo;;0;[o; ;[I" Returned by method #string.;Fo; ;[I"IMore at {Stored String}[rdoc-ref:StringScanner@Stored+String] below.;Fo;;0;[o; ;[I"gA _position_; a zero-based index into the bytes of the stored string (_not_ into its characters):;Fo;;;;[ o;;0;[o; ;[I":Initially set by StringScanner.new to 0.;Fo;;0;[o; ;[I"Returned by method #pos.;Fo;;0;[o; ;[I"MModifiable explicitly by methods #reset, #terminate, and #pos=(new_pos).;Fo;;0;[o; ;[I"FModifiable implicitly (various traversing methods, among others).;Fo; ;[I"XMore at {Byte Position}[rdoc-ref:StringScanner@Byte+Position+-28Position-29] below.;Fo;;0;[ o; ;[I"A target substring, which is a trailing substring of the stored string; it extends from the current position to the end of the stored string:;Fo;;;;[o;;0;[o; ;[I"}Initially set by StringScanner.new(string) to the given string ('foobarbaz' in the example above).;Fo;;0;[o; ;[I"Returned by method #rest.;Fo;;0;[o; ;[I"NModified by any modification to either the stored string or the position.;Fo; ;[I"Most importantly: the searching and traversing methods operate on the target substring, which may be (and often is) less than the entire stored string.;Fo; ;[I"OMore at {Target Substring}[rdoc-ref:StringScanner@Target+Substring] below.;FS; ;i;I"Stored \String;To; ;[I"\The stored string is the string stored in the StringScanner object.;To; ;[I"HEach of these methods sets, modifies, or returns the stored string:;To:RDoc::Markup::Table: @header[I" Method;TI" Effect;T: @align[00: @body[ [I"::new(string);TI"0Creates a new scanner for the given string.;T[I"#string=(new_string);TI")Replaces the existing stored string.;T[I"#concat(more_string);TI"4Appends a string to the existing stored string.;T[I" #string;TI"Returns the stored string.;TS; ;i;I"Positions;To; ;[I"{A StringScanner object maintains a zero-based byte position and a zero-based character position.;To; ;[I"5Each of these methods explicitly sets positions:;To;;[I" Method;TI" Effect;T;[00;[[I" #reset;TI"=Sets both positions to zero (begining of stored string).;T[I"#terminate;TI"9Sets both positions to the end of the stored string.;T[I"#pos=(new_byte_position);TI"4Sets byte position; adjusts character position.;TS; ;i;I"Byte Position (Position);To; ;[I"The byte position (or simply _position_) is a zero-based index into the bytes in the scanner's stored string; for a new StringScanner object, the byte position is zero.;To; ;[I"When the byte position is:;To;;;;[o;;0;[o; ;[I"OZero (at the beginning), the target substring is the entire stored string.;To;;0;[o; ;[I"tEqual to the size of the stored string (at the end), the target substring is the empty string ''.;To; ;[I"%To get or set the byte position:;To;;;;[o;;0;[o; ;[I"%#pos: returns the byte position.;To;;0;[o; ;[I",#pos=(new_pos): sets the byte position.;To; ;[I"Many methods use the byte position as the basis for finding matches; many others set, increment, or decrement the byte position:;To; ;[I"scanner = StringScanner.new('foobar') scanner.pos # => 0 scanner.scan(/foo/) # => "foo" # Match found. scanner.pos # => 3 # Byte position incremented. scanner.scan(/foo/) # => nil # Match not found. scanner.pos # => 3 # Byte position not changed. ;T; ; o; ;[I";Some methods implicitly modify the byte position; see:;To;;;;[o;;0;[o; ;[I"Y{Setting the Target Substring}[rdoc-ref:StringScanner@Setting+the+Target+Substring].;To;;0;[o; ;[I"_{Traversing the Target Substring}[rdoc-ref:StringScanner@Traversing+the+Target+Substring].;To; ;[I"ZThe values of these methods are derived directly from the values of #pos and #string:;To;;;;[o;;0;[o; ;[I"S#charpos: the {character position}[rdoc-ref:StringScanner@Character+Position].;To;;0;[o; ;[I"L#rest: the {target substring}[rdoc-ref:StringScanner@Target+Substring].;To;;0;[o; ;[I"(#rest_size: rest.size.;TS; ;i;I"Character Position;To; ;[I"The character position is a zero-based index into the _characters_ in the stored string; for a new StringScanner object, the character position is zero.;To; ;[I"\\Method #charpos returns the character position; its value may not be reset explicitly.;To; ;[I"JSome methods change (increment or reset) the character position; see:;To;;;;[o;;0;[o; ;[I"Y{Setting the Target Substring}[rdoc-ref:StringScanner@Setting+the+Target+Substring].;To;;0;[o; ;[I"_{Traversing the Target Substring}[rdoc-ref:StringScanner@Traversing+the+Target+Substring].;To; ;[I"5Example (string includes multi-byte characters):;To; ;[I"scanner = StringScanner.new(ENGLISH_TEXT) # Five 1-byte characters. scanner.concat(HIRAGANA_TEXT) # Five 3-byte characters scanner.string # => "Helloこんにちは" # Twenty bytes in all. put_situation(scanner) # Situation: # pos: 0 # charpos: 0 # rest: "Helloこんにちは" # rest_size: 20 scanner.scan(/Hello/) # => "Hello" # Five 1-byte characters. put_situation(scanner) # Situation: # pos: 5 # charpos: 5 # rest: "こんにちは" # rest_size: 15 scanner.getch # => "こ" # One 3-byte character. put_situation(scanner) # Situation: # pos: 8 # charpos: 6 # rest: "んにちは" # rest_size: 12 ;T; ; S; ;i;I"Target Substring;To; ;[I"The target substring is the the part of the {stored string}[rdoc-ref:StringScanner@Stored+String] that extends from the current {byte position}[rdoc-ref:StringScanner@Byte+Position+-28Position-29] to the end of the stored string; it is always either:;To;;;;[o;;0;[o; ;[I"6The entire stored string (byte position is zero).;To;;0;[o; ;[I"HA trailing substring of the stored string (byte position positive).;To; ;[I"eThe target substring is returned by method #rest, and its size is returned by method #rest_size.;To; ;[I"Examples:;To; ;[I"scanner = StringScanner.new('foobarbaz') put_situation(scanner) # Situation: # pos: 0 # charpos: 0 # rest: "foobarbaz" # rest_size: 9 scanner.pos = 3 put_situation(scanner) # Situation: # pos: 3 # charpos: 3 # rest: "barbaz" # rest_size: 6 scanner.pos = 9 put_situation(scanner) # Situation: # pos: 9 # charpos: 9 # rest: "" # rest_size: 0 ;T; ; S; ;i;I"!Setting the Target Substring;To; ;[I"*The target substring is set whenever:;To;;;;[o;;0;[o; ;[I"The {stored string}[rdoc-ref:StringScanner@Stored+String] is set (position reset to zero; target substring set to stored string).;To;;0;[o; ;[I"}The {byte position}[rdoc-ref:StringScanner@Byte+Position+-28Position-29] is set (target substring adjusted accordingly).;TS; ;i;I""Querying the Target Substring;To; ;[I"?This table summarizes (details and examples at the links):;To;;[I" Method;TI" Returns;T;[00;[[I" #rest;TI"Target substring.;T[I"#rest_size;TI"&Size (bytes) of target substring.;TS; ;i;I"#Searching the Target Substring;To; ;[I"A _search_ method examines the target substring, but does not advance the {positions}[rdoc-ref:StringScanner@Positions] or (by implication) shorten the target substring.;To; ;[I"?This table summarizes (details and examples at the links):;To;;[I" Method;TI" Returns;TI"Sets Match Values?;T;[000;[ [I"#check(pattern);TI"(Matched leading substring or +nil+.;TI" Yes.;T[I"#check_until(pattern);TI"+Matched substring (anywhere) or +nil+.;TI" Yes.;T[I"#exist?(pattern);TI",Matched substring (anywhere) end index.;TI" Yes.;T[I"#match?(pattern);TI"0Size of matched leading substring or +nil+.;TI" Yes.;T[I"#peek(size);TI"/Leading substring of given length (bytes).;TI"No.;T[I"#peek_byte;TI"#Integer leading byte or +nil+.;TI"No.;T[I" #rest;TI"2Target substring (from byte position to end).;TI"No.;TS; ;i;I"$Traversing the Target Substring;To; ;[I"LA _traversal_ method examines the target substring, and, if successful:;To;;;;[o;;0;[o; ;[I"@Advances the {positions}[rdoc-ref:StringScanner@Positions].;To;;0;[o; ;[I"#Shortens the target substring.;To; ;[I";This table summarizes (details and examples at links):;To;;[I" Method;TI" Returns;TI"Sets Match Values?;T;[000;[ [I"#get_byte;TI"Leading byte or +nil+.;TI"No.;T[I" #getch;TI" Leading character or +nil+.;TI"No.;T[I"#scan(pattern);TI"(Matched leading substring or +nil+.;TI" Yes.;T[I"#scan_byte;TI"#Integer leading byte or +nil+.;TI"No.;T[I"#scan_until(pattern);TI"+Matched substring (anywhere) or +nil+.;TI" Yes.;T[I"#skip(pattern);TI"-Matched leading substring size or +nil+.;TI" Yes.;T[I"#skip_until(pattern);TI"9Position delta to end-of-matched-substring or +nil+.;TI" Yes.;T[I" #unscan;TI" +self+.;TI"No.;TS; ;i;I"Querying the Scanner;To; ;[I"jEach of these methods queries the scanner object without modifying it (details and examples at links);To;;[I" Method;TI" Returns;T;[00;[[I"#beginning_of_line?;TI"+true+ or +false+.;T[I" #charpos;TI"Character position.;T[I" #eos?;TI"+true+ or +false+.;T[I"#fixed_anchor?;TI"+true+ or +false+.;T[I" #inspect;TI"%String representation of +self+.;T[I" #pos;TI"Byte position.;T[I" #rest;TI"Target substring.;T[I"#rest_size;TI"Size of target substring.;T[I" #string;TI"Stored string.;TS; ;i;I" Matching;To; ;[I" StringScanner implements pattern matching via Ruby class {Regexp}[https://docs.ruby-lang.org/en/master/Regexp.html], and its matching behaviors are the same as Ruby's except for the {fixed-anchor property}[rdoc-ref:StringScanner@Fixed-Anchor+Property].;TS; ;i;I"Matcher Methods;To; ;[I"Each matcher method takes a single argument pattern, and attempts to find a matching substring in the {target substring}[rdoc-ref:StringScanner@Target+Substring].;To;;[ I" Method;TI"Pattern Type;TI"Matches Target Substring;TI"Success Return;TI"May Update Positions?;T;[ 00000;[ [ I" #check;TI"Regexp or String.;TI"At beginning.;TI"Matched substring.;TI"No.;T[ I"#check_until;TI"Regexp or String.;TI"Anywhere.;TI"Substring.;TI"No.;T[ I" #match?;TI"Regexp or String.;TI"At beginning.;TI"Match size.;TI"No.;T[ I" #exist?;TI"Regexp or String.;TI"Anywhere.;TI"Substring size.;TI"No.;T[ I" #scan;TI"Regexp or String.;TI"At beginning.;TI"Matched substring.;TI" Yes.;T[ I"#scan_until;TI"Regexp or String.;TI"Anywhere.;TI"Substring.;TI" Yes.;T[ I" #skip;TI"Regexp or String.;TI"At beginning.;TI"Match size.;TI" Yes.;T[ I"#skip_until;TI"Regexp or String.;TI"Anywhere.;TI"Substring size.;TI" Yes.;To; ;[I"
;To; ;[I"-Which matcher you choose will depend on:;To;;;;[o;;0;[o; ;[I"$Where you want to find a match:;Fo;;;;[o;;0;[o; ;[I"SOnly at the beginning of the target substring: #check, #match?, #scan, #skip.;Fo;;0;[o; ;[I"XAnywhere in the target substring: #check_until, #exist?, #scan_until, #skip_until.;Fo;;0;[o; ;[I"Whether you want to:;Fo;;;;[o;;0;[o; ;[I"STraverse, by advancing the positions: #scan, #scan_until, #skip, #skip_until.;Fo;;0;[o; ;[I"KKeep the positions unchanged: #check, #check_until, #match?, #exist?.;Fo;;0;[o; ;[I"(What you want for the return value:;Fo;;;;[ o;;0;[o; ;[I"*The matched substring: #check, #scan.;Fo;;0;[o; ;[I".The substring: #check_until, #scan_until.;Fo;;0;[o; ;[I"$The match size: #match?, #skip.;Fo;;0;[o; ;[I".The substring size: #exist?, #skip_until.;FS; ;i;I"Match Values;To; ;[I"The match values in a StringScanner object generally contain the results of the most recent attempted match.;To; ;[I"+Each match value may be thought of as:;To;;;;[o;;0;[o; ;[I"_Clear_: Initially, or after an unsuccessful match attempt: usually, false, nil, or {}.;To;;0;[o; ;[I"Y_Set_: After a successful match attempt: true, string, array, or hash.;To; ;[I"/Each of these methods clears match values:;To;;;;[o;;0;[o; ;[I"::new(string).;To;;0;[o; ;[I" #reset.;To;;0;[o; ;[I"#terminate.;To; ;[I"Each of these methods attempts a match based on a pattern, and either sets match values (if successful) or clears them (if not);;To;;;;[ o;;0;[o; ;[I"#check(pattern);To;;0;[o; ;[I"#check_until(pattern);To;;0;[o; ;[I"#exist?(pattern);To;;0;[o; ;[I"#match?(pattern);To;;0;[o; ;[I"#scan(pattern);To;;0;[o; ;[I"#scan_until(pattern);To;;0;[o; ;[I"#skip(pattern);To;;0;[o; ;[I"#skip_until(pattern);TS; ;i ;I"Basic Match Values;To; ;[I":Basic match values are those not related to captures.;To; ;[I"7Each of these methods returns a basic match value:;To;;[I" Method;TI"Return After Match;TI"Return After No Match;T;[000;[ [I"#matched?;TI" +true+.;TI" +false+.;T[I"#matched_size;TI"Size of matched substring.;TI" +nil+.;T[I" #matched;TI"Matched substring.;TI" +nil+.;T[I"#pre_match;TI"+Substring preceding matched substring.;TI" +nil+.;T[I"#post_match;TI"+Substring following matched substring.;TI" +nil+.;To; ;[I"
;To; ;[I"See examples below.;TS; ;i ;I"Captured Match Values;To; ;[I"Captured match values are those related to {captures}[https://docs.ruby-lang.org/en/master/Regexp.html#class-Regexp-label-Groups+and+Captures].;To; ;[I":Each of these methods returns a captured match value:;To;;[I" Method;TI"Return After Match;TI"Return After No Match;T;[000;[ [I" #size;TI""Count of captured substrings.;TI" +nil+.;T[I" #[](n);TI"%nth captured substring.;TI" +nil+.;T[I"#captures;TI"&Array of all captured substrings.;TI" +nil+.;T[I"#values_at(*n);TI",Array of specified captured substrings.;TI" +nil+.;T[I"#named_captures;TI"Hash of named captures.;TI"{}.;To; ;[I"
;To; ;[I"See examples below.;TS; ;i ;I"Match Values Examples;To; ;[I"2Successful basic match attempt (no captures):;To; ;[I"scanner = StringScanner.new('foobarbaz') scanner.exist?(/bar/) put_match_values(scanner) # Basic match values: # matched?: true # matched_size: 3 # pre_match: "foo" # matched : "bar" # post_match: "baz" # Captured match values: # size: 1 # captures: [] # named_captures: {} # values_at: ["bar", nil] # []: # [0]: "bar" # [1]: nil ;T; ; o; ;[I".Failed basic match attempt (no captures);;To; ;[I"nscanner = StringScanner.new('foobarbaz') scanner.exist?(/nope/) match_values_cleared?(scanner) # => true ;T; ; o; ;[I".Successful unnamed capture match attempt:;To; ;[I"Qscanner = StringScanner.new('foobarbazbatbam') scanner.exist?(/(foo)bar(baz)bat(bam)/) put_match_values(scanner) # Basic match values: # matched?: true # matched_size: 15 # pre_match: "" # matched : "foobarbazbatbam" # post_match: "" # Captured match values: # size: 4 # captures: ["foo", "baz", "bam"] # named_captures: {} # values_at: ["foobarbazbatbam", "foo", "baz", "bam", nil] # []: # [0]: "foobarbazbatbam" # [1]: "foo" # [2]: "baz" # [3]: "bam" # [4]: nil ;T; ; o; ;[I"_Successful named capture match attempt; same as unnamed above, except for #named_captures:;To; ;[I"scanner = StringScanner.new('foobarbazbatbam') scanner.exist?(/(?foo)bar(?baz)bat(?bam)/) scanner.named_captures # => {"x"=>"foo", "y"=>"baz", "z"=>"bam"} ;T; ; o; ;[I"*Failed unnamed capture match attempt:;To; ;[I"{scanner = StringScanner.new('somestring') scanner.exist?(/(foo)bar(baz)bat(bam)/) match_values_cleared?(scanner) # => true ;T; ; o; ;[I"[Failed named capture match attempt; same as unnamed above, except for #named_captures:;To; ;[I"scanner = StringScanner.new('somestring') scanner.exist?(/(?foo)bar(?baz)bat(?bam)/) match_values_cleared?(scanner) # => false scanner.named_captures # => {"x"=>nil, "y"=>nil, "z"=>nil} ;T; ; S; ;i;I"Fixed-Anchor Property;To; ;[I"Pattern matching in StringScanner is the same as in Ruby's, except for its fixed-anchor property, which determines the meaning of '\A':;To;;;;[o;;0;[o; ;[I"Ifalse (the default): matches the current byte position.;To; ;[I"scanner = StringScanner.new('foobar') scanner.scan(/\A./) # => "f" scanner.scan(/\A./) # => "o" scanner.scan(/\A./) # => "o" scanner.scan(/\A./) # => "b" ;F; ; o;;0;[o; ;[I"wtrue: matches the beginning of the target substring; never matches unless the byte position is zero:;To; ;[I"scanner = StringScanner.new('foobar', fixed_anchor: true) scanner.scan(/\A./) # => "f" scanner.scan(/\A./) # => nil scanner.reset scanner.scan(/\A./) # => "f" ;F; ; o; ;[I"The fixed-anchor property is set when the StringScanner object is created, and may not be modified (see StringScanner.new); method #fixed_anchor? returns the setting.;T: @fileI"ext/strscan/strscan.c;T:0@omit_headings_from_table_of_contents_below0;0;0[[[[[I" class;T[[: public[[I"new;TI"ext/strscan/strscan.c;T[:protected[[: private[[I" instance;T[[;[.[I"<<;T@p[I"[];T@p[I"beginning_of_line?;T@p[I" captures;T@p[I" charpos;T@p[I" check;T@p[I"check_until;T@p[I" concat;T@p[I" eos?;T@p[I" exist?;T@p[I"fixed_anchor?;T@p[I" get_byte;T@p[I" getch;T@p[I" inspect;T@p[I" match?;T@p[I" matched;T@p[I" matched?;T@p[I"matched_size;T@p[I"named_captures;T@p[I" peek;T@p[I"peek_byte;T@p[I" pointer;T@p[I" pointer=;T@p[I"pos;T@p[I" pos=;T@p[I"post_match;T@p[I"pre_match;T@p[I" reset;T@p[I" rest;T@p[I"rest_size;T@p[I" scan;T@p[I"scan_byte;T@p[I"scan_until;T@p[I" size;T@p[I" skip;T@p[I"skip_until;T@p[I" string;T@p[I" string=;T@p[I"terminate;T@p[I" unscan;T@p[I"values_at;T@p[;[[;[[I"initialize_copy;T@p[I"scan_base10_integer;T@p[I"scan_base16_integer;T@p[[U:RDoc::Context::Section[i0o;;[;0;0[@d@dcRDoc::TopLevel