条件语句在Ruby中没有按预期工作

时间:2014-12-18 18:04:01

标签: ruby

我有一个方法,它接受2个参数 - 在屏幕上打印消息和(默认)值。如果默认值为nil,那么我只想在屏幕上打印消息,否则消息应包含方括号中的默认值。

例如:如果我通过method1("Hello" , ""),则应打印Hello,但如果我通过method1("Hello", "User"),则应打印Hello [User]:。但是现在即使在第二种情况下也只打印Hello

以下是我的代码:

def method1(mes, value)
  val = ""
  begin
    if value == "" || "#{value}".to_i == 0
      val = ask(mes) do |ch|
        ch = true
      end
    else
      val = ask(message+" [#{value}]: ") do |ch|
        ch = true
      end
    end

    if val == "" then
      val = "#{value}"
    end

  rescue => e
    print "Except occured in method1(#{mes}, #{value}) "+e
  end

  return val
end

3 个答案:

答案 0 :(得分:2)

那是因为to_i为每个不是数字的字符串返回0

"User".to_i == 0
# => true

所以,在你的代码中:

value = "User"

if value == "" || "#{value}".to_i == 0
  puts "was here"
end
# => "was here"

您应该更改条件,或者检查valuenil还是空

if value.nil? || value.empty?

如果您使用的是Rails,则可以使用blank?方法:

if value.blank?

答案 1 :(得分:0)

如果您正在使用rails

value.blank?

如果您只使用红宝石

empty = input2.respond_to?(:empty?) ? input2.empty? : input2.to_s.length.zero?

作为value.empty?不会对数字起作用

完整的解决方案

def method1(input1, input2)
  result = input2.respond_to?(:empty?) ? !input2.empty? : input2.to_s.length > 0
  input2 = "#{ result ? input2 : '' }"
  puts input2.empty? ? input1 : "#{ input1 } [#{ input2 }]" 
end

method1('Hello', '')
method1('Hello', 2)
method1('Hello', [])
method1('Hello', [2])
method1('Hello', {})
method1('Hello', { a: 2 })
method1('Hello', false)

#Output
Hello
Hello [Mr]
Hello [2]
Hello
Hello [[2]]
Hello
Hello [{:a=>2}]
Hello [false]

答案 2 :(得分:0)

试试这个

def func(mes, val = "")
  puts val.size != 0  ? "#{mes} [#{val}]" : "#{mes}"
end

输出:

func(123)             # 123
func("Hello")         # Hello
func("Hello", 123)    # Hello [123]
func("Hello", "test") # Hello [test]