Rails optional argument

后端 未结 4 841
礼貌的吻别
礼貌的吻别 2020-12-07 17:49

I have a class

class Person
    attr_accessor :name,:age
    def initialize(name,age)
        @name = name
        @age = age
    end
end

I

相关标签:
4条回答
  • 2020-12-07 18:05

    This is more of a Ruby thing. You can define optional arguments for a method like this:

    def initialize(name="", age=0)
      @name = name
      @age = age
    end
    

    By doing it this way, you will be able to call Person.new and then have name default to a blank string if it's not passed and age default to 0. If you want age to be something but name to be blank you'll need to pass an empty string anyway:

    Person.new("", 24)
    
    0 讨论(0)
  • 2020-12-07 18:10

    If you want both arguments to be optional but also set default values when nil then you could go with:

    class Person

    def initialize(name = nil, age = 0)
      @name ||= "Default name"
      @age = age
    end
    

    end

    This gets over the issue of passing nil as the first option but still getting a useable default value.

    @person = Person.new nil, 30
    @person.name # => "Default name"
    @person.age # => 30
    
    0 讨论(0)
  • 2020-12-07 18:19

    Use hash for ruby 1.8/1.9 as follow:

    def myMethod(options={})
      @email = options[:email]
      @phone = options[:phone]
    end
    
    # sample usage
    myMethod({:email => "example@email.ir", :phone => "0098-511-12345678"})
    

    Also on ruby 2.0/2.1 you can use keyword arguments as follow:

    def myMethod(email: 'default@email.ir', phone: '0098-000-00000000')
      @email = email
      @phone = phone
    end
    
    # sample usage
    myMethod(email: "example@email.ir", phone: "0098-511-12345678")
    
    0 讨论(0)
  • 2020-12-07 18:20

    It's as simple as this:

    class Person
        attr_accessor :name, :age
    
        def initialize(name = '', age = 0)
            self.name = name
            self.age = age
        end
    end
    
    
    Person.new('Ivan', 20)
    Person.new('Ivan')
    

    However, if you want to pass only age, the call would look pretty ugly, because you have to supply blank string for name anyway:

    Person.new('', 20)
    

    To avoid this, there's an idiomatic way in Ruby world: options parameter.

    class Person
        attr_accessor :name, :age
    
        def initialize(options = {})
            self.name = options[:name] || ''
            self.age = options[:age] || 0
        end
    end
    
    Person.new(name: 'Ivan', age: 20)
    Person.new(age: 20)
    Person.new(name: 'Ivan')
    

    You can put some required parameters first, and shove all the optional ones into options.

    Edit

    It seems that Ruby 2.0 will support real named arguments.

    def example(foo: 0, bar: 1, grill: "pork chops")
      puts "foo is #{foo}, bar is #{bar}, and grill is #{grill}"
    end
    
    # Note that -foo is omitted and -grill precedes -bar
    example(grill: "lamb kebab", bar: 3.14)
    
    0 讨论(0)
提交回复
热议问题