Professional Web Applications Themes

String#hex confusion - Ruby

$ irb x x(main):001:0> "This works" => "This works" x(main):002:0> '22' => "22" x(main):003:0> '22'.class => String x(main):004:0> '22'.hex.to_s => "34" x(main):005:0> "Why doesn't this?" => "Why doesn't this?" x(main):006:0> '22'.sub(/(\d\d)/, "#{'

'}") => "22" x(main):007:0> '22'.sub(/(\d\d)/, "#{'
'.class}") => "String" x(main):008:0> '22'.sub(/(\d\d)/, "#{'
'.hex.to_s}") => "0" I understand everything but the last line. What am I missing? Steve...

  1. #1

    Default String#hex confusion

    $ irb x
    x(main):001:0> "This works"
    => "This works"
    x(main):002:0> '22'
    => "22"
    x(main):003:0> '22'.class
    => String
    x(main):004:0> '22'.hex.to_s
    => "34"
    x(main):005:0> "Why doesn't this?"
    => "Why doesn't this?"
    x(main):006:0> '22'.sub(/(\d\d)/, "#{'\1'}")
    => "22"
    x(main):007:0> '22'.sub(/(\d\d)/, "#{'\1'.class}")
    => "String"
    x(main):008:0> '22'.sub(/(\d\d)/, "#{'\1'.hex.to_s}")
    => "0"

    I understand everything but the last line. What am I missing?

    Steve


    Steven Guest

  2. #2

    Default Re: [ruby] String#hex confusion

    On Sat, 21 Feb 2004 04:31:07 +0900, Steven Jenkins wrote: 

    You are applying 'hex' to the literal string "\1". Since '\' is not a hex
    digit, it returns 0. What you really want is:

    '22'.sub(/(\d\d)/) { "#{$1.hex.to_s}" }

    -- ES


    Eric Guest

  3. #3

    Default Re: String#hex confusion


    On Feb 20, 2004, at 11:31 AM, Steven Jenkins wrote:
     

    try this:

    irb(main):001:0> '22'.sub(/(\d\d)/, "#{'\1'.inspect}")
    => "\"\\1\""

    whoa! in your example, lines 007 and 008, you are calling the #class
    and #hex methods on the string literal '\1', not the result of the
    substitution.

    Instead, you may want:

    irb(main):002:0> '22'.sub(/(\d\d)/){$1.inspect}
    => "\"22\""
    irb(main):003:0> '22'.sub(/(\d\d)/){$1.hex.to_s}
    => "34"

    If you pass a block to #sub or #gsub, it passes the block and evaluates
    it each time it finds a match, whereas passing a replacement string as
    an argument to those methods will evaluate the string once. So any time
    you want to use code in #sub or #gsub, always pass a block, or you
    might get strange results.

    -Mark



    Mark Guest

  4. #4

    Default Re: String#hex confusion

    Mark Hubbart wrote:
     

    OK, that makes sense. '\1'.class == '22'.class. Thanks, Mark (& Eric).

    Steve


    Steven Guest

Similar Threads

  1. ai. vs pdf confusion
    By Johanna_O.@adobeforums.com in forum Adobe Illustrator Macintosh
    Replies: 19
    Last Post: April 21st, 06:54 PM
  2. sub confusion
    By in forum PERL Miscellaneous
    Replies: 11
    Last Post: November 5th, 12:46 AM
  3. String Comparison Confusion
    By Joe Johnson in forum Ruby
    Replies: 8
    Last Post: October 22nd, 03:49 PM

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •