如果给定的块类型是整数,如何在ruby Hash中添加元素?

时间:2012-06-18 10:09:44

标签: ruby

def self.jq_column_models
  COLUMN_NAME.collect {|x|
    {:name => x.to_s, :width => 80, :format => 'integer' if x.is_a?(Fixnum)}
  }
end

:format => 'integer' if x.is_a?只是整数类型时,我编写了代码:format来添加|x|。但它没有编译。你如何用ruby表达这段代码?

5 个答案:

答案 0 :(得分:3)

您可以使用tap(自我产生;自我):

  COLUMN_NAME.collect {|x|
    {:name => x.to_s, :width => 80}.tap{|y| y[:format] ='integer' if x.is_a?(Integer)}
  }

答案 1 :(得分:1)

只需在另一个声明中添加:format

h = {:name => x.to_s, :width => 80}
h[:format] = 'integer' if x.kind_of? Integer

答案 2 :(得分:1)

def self.jq_column_models
  COLUMN_NAME.each_with_object([]) do |x,memo|
    h = {:name => x.to_s, :width => 80}
    h[:format] = 'integer if x.is_a?(Fixnum)
    memo << h
  end
end

答案 3 :(得分:0)

好的,所以你必须使用两个语句:

hash = {:name => x.to_s, :width => 80}
hash[:format] = 'integer' if x.is_a? Fixnum

答案 4 :(得分:0)

只是为了补充其他答案,一个不涉及陈述的功能性解决方案。首先,将此通用方法添加到扩展库:

class Hash
  def with_values
    select { |k, v| block_given? ? yield(v) : v }
  end
end

现在使用它:

{:name => x.to_s, :width => 80, :format => ('integer' if x.is_a?(Fixnum))}.with_values

当然,如果nil是合法的价值(通常不应该这样),这将无效。