Ruby类使用默认哈希初始化方法

时间:2016-02-16 00:15:22

标签: ruby

我在Sandi Metz的演讲here中偶然发现了这个功能。

似乎你可以定义一个类的initialize函数来接受一个哈希(没有名字),并且它已经自动转换为带有键作为名称的参数?真的吗?这定义在哪里?这是一个例子:

class House
  attr_reader :var1
  attr_reader :var2

  def initialize(var1: 'var1value', var2: 'var2value')
    puts var1
    puts var2
  end
end

House.new

运行此文件将输出:

var1value
var2value

此外,看起来默认哈希与传入的值合并。例如:

class House
  attr_reader :var1
  attr_reader :var2

  def initialize(var1: 'var1value', var2: 'var2value')
    puts var1
    puts var2
  end
end

House.new(var2: 'newvar2value')

运行此命令将输出:

var1value
newvar2value

这看起来真的非常棒和有用的功能。我从未意识到这可以做到。它在某处记录了吗?或者有人可以解释这里发生了什么?

2 个答案:

答案 0 :(得分:3)

Ruby 2.0引入了关键字参数。

documentation提供了详细信息,然后Ruby Rogues podcast对此进行了有趣的讨论。

请注意,这适用于任何方法,不仅适用于initialize

答案 1 :(得分:2)

House课程中,如果用户没有发送自己的值,您可以设置要发送给课程的默认参数。该默认参数是单个参数,哈希,具有键/值对。您通过为某个键发送自己的值来查看,该值将设置为您想要的新值。

如果你有很多参数,通常使用哈希作为参数传递更方便,因为你不必按特定顺序写所有参数。即..

def method(name, lname, age, city, state, phone, cell)
end

#vs...

def method({name: "", lname: "", age: "", city: ""}) 
end

您不必记住参数传递给方法的顺序。

以下是传递哈希参数的方便用法:

class Drink
  attr_accessor :type, :flavor

  def initialize(params = {})
    @type = params.fetch(:type, 'orange')
    @flavor = params.fetch(:flavor, 'sweet')
  end
end

Drink.new()  #=> orange / sweet
Drink.new(:type => 'apple')  #=> apple / sweet

您可以将默认参数设置为其相对实例变量。如果参数未通过,则设置默认参数。