Ruby: передача необязательных объектов в метод - PullRequest
0 голосов
/ 21 мая 2010
Class TShirt

def size(suggested_size)
  if suggested_size == nil
   size = "please choose a size"
  else
   size = suggested_size
  end
end
end 

tshirt = TShirt.new
tshirt.size("M")

== "M"

tshirt = TShirt.new
tshirt.size(nil)

== "please choose a size"

Какой лучший способ иметь дополнительные объекты в методе? Procs?

Ответы [ 3 ]

5 голосов
/ 21 мая 2010

Значения по умолчанию могут быть тем, что вы ищете:

def size(suggested_size="please choose a size") 

Более подробную информацию о значениях по умолчанию можно найти в викибук . Они также просматривают списки аргументов переменной длины и опцию передачи хэша опций методу, которые вы можете увидеть во многих кодах Rails ...

Переменный список аргументов

Файл вендора / rails / activerecord / lib / active_record / base.rb, строка 607:

def find(*args)
  options = args.extract_options!
  validate_find_options(options)
  set_readonly_option!(options)

  case args.first
    when :first then find_initial(options)
    when :last  then find_last(options)
    when :all   then find_every(options)
    else             find_from_ids(args, options)
  end
end

Опции Hash

Файл вендора / rails / activerecord / lib / active_record / base.rb, строка 1361:

def human_attribute_name(attribute_key_name, options = {})
  defaults = self_and_descendants_from_active_record.map do |klass|
    "#{klass.name.underscore}.#{attribute_key_name}""#{klass.name.underscore}.#{attribute_key_name}"
  end
  defaults << options[:default] if options[:default]
  defaults.flatten!
  defaults << attribute_key_name.humanize
  options[:count] ||= 1
  I18n.translate(defaults.shift, options.merge(:default => defaults, :scope => [:activerecord, :attributes]))
end

Атрибуты объекта

Если вы ищете дополнительные атрибуты в объекте, вы можете написать метод получения и установки в вашем классе:

Class TShirt
  def size=(new_size)
    @size = new_size
  end

  def size
    @size ||= "please choose a size"
  end
end

Тогда вы можете просто вызвать use tshirt.size = "xl" и tshirt.size для экземпляра вашего класса TShirt.

2 голосов
/ 21 мая 2010

Вы можете использовать значения по умолчанию для аргументов (def size(suggested_size = nil)) или использовать список переменных переменных (def size(*args)).

1 голос
/ 21 мая 2010

Ваш код также мог быть написан так:

class TShirt
  def size(suggested_size)
    suggested_size ||= "please choose size" 
  end
end

x ||= "oi" совпадает с x = "oi" if x.nil?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...