2013-05-03 44 views
1

下面的代码将收集器变量“sql”作为字符串开始生命,然后强制转换为fixnum。这种转换没有明显的理由。字符串变量强制转化为fixnum里面注入(aka reduce)为ruby

segs=['segment1', 'segment2'] 
sx=1 
sqlout = segs.inject("select ") do | sql, seg| 
    puts "class of sql: #{sql.class}" 
    salias = "#{seg.slice(1,3)}" 
    if sx > 1 then sql <<= " ," end # this if the offending line 8 
    sql <<= "#{salias}.score as #{seg}_score" 
    puts "class of sql at end: #{sql.class}" 
    sx+=1 
end 

的结果是

class of sql: String 
class of sql at end: String 
class of sql: Fixnum 
TypeError: can't convert String into Integer 
     << at org/jruby/RubyBignum.java:751 
     << at org/jruby/RubyFixnum.java:1155 
    (root) at ./pivot.rb:8 
    each at org/jruby/RubyArray.java:1613 
    inject at org/jruby/RubyEnumerable.java:820 
    (root) at ./pivot.rb:5 

回答

2

您正在重返inject错误的值。以下应工作

segs=['segment1', 'segment2'] 
sx=1 
sqlout = segs.inject("select ") do | sql, seg| 
    puts "class of sql: #{sql.class}" 
    salias = "#{seg.slice(1,3)}" 
    if sx > 1 then sql <<= " ," end # this if the offending line 8 
    sql <<= "#{salias}.score as #{seg}_score" 
    puts "class of sql at end: #{sql.class}" 
    sx+=1 
    sql 
end 

记得在inject下一个输入是块的回报,没有通过第一个变量。

结果:

class of sql: String 
class of sql at end: String 
class of sql: String 
class of sql at end: String 
+0

哦!错误的行号是通过我的 - 我甚至没有看得更远。 – javadba 2013-05-03 23:12:26