什么类型的指令可以在陈述时(案例)下面?

时间:2016-10-04 19:16:30

标签: ruby

什么类型的说明可以放在什么时候?我的一些代码在if / else下工作,但在大小写的情况下不起作用。

例如

def categories(massIndex)
  case massIndex
  when >= 30.0
    "obese"
    #[some instructions like this]
  else
    "error"
  end
end

我总是看到这样的错误:

bmi.rb:8: syntax error, unexpected >=
when >= 30.0

但是当我使用if / else时,它可以工作:

def categories(massIndex)
  if massIndex >= 25
    "something"
  else
    "error"
  end
end

我可以使用案例修复它,还是必须使用if / else?

2 个答案:

答案 0 :(得分:4)

case x
when y
  puts "y"
when z
  puts "z"
end

相当于

if y === x
  puts "y"
elsif z === x
  puts "z"
end

例如

case "hello"
when Array
  puts "Array"
when String
  puts "String"
end
  #=> "String"

x = "hello"
if Array === x
  puts "Array"
elsif String === x
  puts "String"
end
  #=> "String"

注意:

Array.method(:===).owner 
  #=> Module 
String.method(:===).owner 
  #=> Module 

请参阅Module#===

所以当你写

case massIndex
when >= 30.0
  "obese"
...

Ruby尝试评估

(>= 30.0) === massIndex

导致她引发语法错误。

此处的另一个示例说明了方法===的有用性。

case "spiggot"
when /cat/ then "cat"
when /dog/ then "dog"
when /pig/ then "pig"
end
  #=> pig

由于

/cat/.method(:===).owner
  #=> Regexp 

请参阅Regexp#===

Here是关于case声明的优秀文章。

答案 1 :(得分:2)

from kivy.uix.popup import Popup
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.app import App
from kivy.lang import Builder
from kivy.properties import StringProperty

Builder.load_string('''
<CustomPopup>:
    size_hint: .5, .5
    auto_dismiss: False
    title: 'Hello world'
    BoxLayout:
        text_input: text_input
        orientation: 'vertical'
        TextInput:
            id: text_input
        Button:
            text: 'dismiss'    
            on_press: root.dismiss()
''')

class CustomPopup(Popup):
    pass

class TestApp(App):
    popup_text = StringProperty()

    def build(self):
        l = BoxLayout()
        l.add_widget(Button(
            text='show_popup', on_press=self.show_popup
        ))
        l.add_widget(Button(
            text='print popup text', on_press=self.print_popup_text
        ))
        return l    

    def show_popup(self, *args):
        p = CustomPopup()
        p.content.text_input.bind(text=self.setter('popup_text'))
        p.open()

    def print_popup_text(self, *args):
        print(self.popup_text)

if __name__ == '__main__':
    TestApp().run()