注:原帖地址http://www.simonecarletti.com/blog/2009/09/inside-ruby-on-rails-extract_options-from-arrays/
刚刚在讨论《代码的未来》的翻译, 我也来试试,体验下译者的辛苦,请在评论里纠错我英文很烂
在Rails项目里面是不是经常看到下面的方法调用?
my_method :arg1my_method :arg1, :arg2, :argNmy_method :arg1, :foo => true, :bar => 1
my_method
的特别之处在于它可以接受任意数量的参数(:arg1
, :arg2
…)后跟一个键值对的选项(options)。
ActiveSupport
中提供的一个叫做extract_options!
的牛逼方法使之成为可能。它的主要作用是提取给出的参数中的选项(options)。如果没有选项(options)它会返回一个空的Hash。
给你们秀一个列子!
# Use args with the splat operation to allow# an unlimited number of parametersdef my_method(*args) options = args.extract_options! puts "Arguments: #{args.inspect}" puts "Options: #{options.inspect}"endmy_method(1, 2)# Arguments: [1, 2]# Options: {}my_method(1, 2, :a => :b)# Arguments: [1, 2]# Options: {:a=>:b}
extract_options!
被大量用在Rails项目中,你肯定已经遇见它无数次了。它驱动(powers)了大多数你每天用到的的Rails 功能,包括ActionController filters,ActiveRecord validations 和 finder 方法。
# ActionController filtersclass MyController < ApplicationController before_filter :my_method, :if => :execute?, :only => %w(new)end# ActiveRecord validations and findersclass MyModel < ActiveRecord::Base validates_presence_of :field, :allow_blank => true ... def self.my_find find(:all, :order => "id", :limit => 10) endend
extract_options!
可以让你从一个数组的参数中方便的提取出选项列(a list of options),这通常发生在方法调用时。它不是Ruby的标准方法,但是它是Rails的核心扩展,并且你需要引用 ActiveSupport
才能使用。请注意它是一个“bang”方法,因此它会修改调用它的对象。
原文地址:理解Rails之Array的extract_options!方法, 感谢原作者分享。 生活若剥去了理想梦想幻想,那生命便只是一堆空架子