如何编写一个在ruby中返回字符串的块

时间:2009-11-06 07:09:30

标签: ruby

函数将字符串作为参数,例如fn(“string”)。

我希望根据三个更多条件传递不同的值,一种稍微不可读的方法是:

fn(check_1 ? "yes" : check_2 ? "no" : "maybe")

我想用一个返回字符串的块替换参数。我希望我可以这样做:

fn({|arg| if check_1 
    arg = "yes"
  elsif check_2
    arg = "no"
  else 
    arg = "maybe"
  end
})

我可以有更多的条件,并且仍然可以写出所有这些,就好像这是一行。

我如何在Ruby中执行此操作?

5 个答案:

答案 0 :(得分:3)

阻止很酷,但这并不意味着我们总是必须使用它。

恕我直言,使用单独的函数来获取要传递给fn的字符串会更加清晰。

 def arg w
    if w.eql? "check_1"
            "yes"
    elsif w.eql? "check_2"
            "no"
    else
            "maybe"
    end
 end

def fn s
     puts s
end

fn(arg("check_1"))
fn(arg("check_2"))
fn(arg("check_3"))

或者使用Hash作为练习留给您:)

答案 1 :(得分:1)

您可以使用if表达式,甚至是case表达式。见the PickAxe book。您想要做的一个例子就是在页面顶部。

答案 2 :(得分:1)

这听起来有点奇怪。您确定不想传入数组并处理方法中的参数吗?

无论哪种方式,它听起来像你要求的是lambda来处理逻辑,然后你可以将lambda传递给函数以返回实际结果。

def test(parameter)
  puts "I was passed the value: #{parameter}"
end

foo = lambda{|x,y,z|
if x == true
"yes"
elsif y == true
"no"
else
"maybe"
end
}

test(foo[false,true,false])

答案 3 :(得分:1)

arg= check_1&&"yes"||check_2&&"no"||"maybe"

答案 4 :(得分:1)

看起来你对积木有一些误解,但这完全是另一回事。

我认为这会对你有所帮助:

check_1 = false
check_2 = true

def foo(&block)
  puts block.call
end

foo { 
  if check_1 
    arg = "yes"
  elsif check_2
    arg = "no"
  else 
    arg = "maybe"
  end
}