String#hex confusion

S

Steven Jenkins

$ 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
 
E

Eric Sunshine

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

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
 
M

Mark Hubbart

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?

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
 
S

Steven Jenkins

Mark said:
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.

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

Steve
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,756
Messages
2,569,535
Members
45,008
Latest member
obedient dusk

Latest Threads

Top