红宝石中的三元评价

JGu*_*ezC 2 ruby ruby-on-rails

我对红宝石中的一些三元表达很困惑.

我有这个表达式:

puts respond_to? "greeting".to_sym ? "hello" : "bye"
Run Code Online (Sandbox Code Playgroud)

当然,这不是我在我的应用程序中所做的,只是为了让你看到.

问题是上面的表达式返回

false
Run Code Online (Sandbox Code Playgroud)

什么时候应该返回,hello如果方法存在,bye如果它不对吗?

如果我改变表达式

puts respond_to?("greeting".to_sym) ? "hello" : "bye"
Run Code Online (Sandbox Code Playgroud)

它返回正确的东西,如果它存在则为"hello",否则为"bye".

为什么会这样?有什么关于红宝石中的三元表达我不知道吗?

只是为了让您知道我的应用程序中的正确代码是:

respond_to?(path.to_sym) ? self.send(path) : "#"
Run Code Online (Sandbox Code Playgroud)

这将返回db存储的标题菜单的正确路径,如果它不存在,它将只是放置一个"#"以避免错误.

Aje*_*i32 5

没有括号,似乎你的代码被解释为:

puts respond_to?("greeting".to_sym ? "hello" : "bye")
Run Code Online (Sandbox Code Playgroud)

括号中的东西然后评估为"你好",self显然没有响应,所以respond_to?返回false.

这就是为什么每当对代码的操作顺序有任何疑问时使用括号总是一个好主意; 它使您的代码更具可读性并消除了诸如此类的错误.