美文网首页
ruby中respond_to?和send以及'.

ruby中respond_to?和send以及'.

作者: kamionayuki | 来源:发表于2015-05-27 13:25 被阅读206次

    转自:http://selfcontroller.iteye.com/blog/1139556

    如同其他的OO语言一样,在ruby中,通过给对象发送消息,来完成对象的功能,比如 str.upcase ,就是给str发送upcase的消息,点操作符(.),就是用来给对象发送消息的,str接受到消息,然后执行与消息对应的功能。

    但是,某些时候,我们并不知道对象能响应哪些消息,比如下面的代码就会产生错误

    obj = Object.new
    obj.talk
    

    undefined method 'talk' for #<Object:0x12345678> (NoMethodError)

    因为obj对象没法响应talk这个消息,如果使用 respond_to?这个方法,就可以实现判断对象能否响应给定的消息了:

    obj = Object.new
    if obj.respond_to?("talk")
      obj.talk
    else
      puts "Sorry, object can't talk!"
    end
    

    这样即使obj不能响应talk,也不会使代码产生错误退出,我们也可以应用respond_to?方法,根据对象的属性,在程序运行时灵活的控制。

    respond_to?相对应,send方法和点操作符一样,用来给对象发送消息,比如文章开始的 str.upcase ,用 send 可以写成 str.send("upcase"),它们实现的功能是完全相同的,那么为什么还要用send呢?这是因为,send 发送的消息,在程序运行时是可变的,我们可以根据不同的输入,动态的向对象发送不同的消息。

    比如一个图书管理系统,每本书都有诸如作者、出版社、日期、价钱这些,我们要根据用户的输入查询某本书的属性,如果不用send,我们要对程序的输入做一个一个的测试:

    print "Search for: "
    request = gets.chomp
    
    if request == "writer"
      puts book.writer
    elsif request == "press"
      puts book.press
    elseif request == "date"
      puts book.date
    .......
    

    如果用send方法的话,就简单多了:

    request = gets.chomp
    if book.respond_to?(request)
      puts book.send(request)
    else
      puts "Input error"
    end
    

    这样不用在逐个对用户的输入进行测试,只要查询对象能否相应这个消息,再用send将输入直接发送给对象即可。

    通过 respond_to?send 这两个方法,我们可以构造更灵活和稳定的程序。

    相关文章

      网友评论

          本文标题:ruby中respond_to?和send以及'.

          本文链接:https://www.haomeiwen.com/subject/yhprqttx.html