初始化Ruby类,并在符号后加上两点(菜单:)

时间:2018-11-05 13:35:57

标签: ruby rspec

我有以下课程:

class Takeaway
  def initialize(menu:)
    @menu = menu
  end

  def print_menu
    menu.print
  end

  private

  attr_reader :menu
end

该课程通过了我在RSpec中的测试:

require "takeaway"

RSpec.describe Takeaway do

  subject(:takeaway) { described_class.new(menu: menu) }

  let(:menu) { double(:menu, print: printed_menu) }
  let(:printed_menu) { "Chicken: €3.5" }

  it "shows the menu with the dishes and prices" do
    expect(takeaway.print_menu).to eq(printed_menu)
  end

end

我不明白这行:def initialize(menu:)

如果我摆脱了菜单中的两点,则测试无法通过。这个对象是什么?符号吗?

1 个答案:

答案 0 :(得分:2)

这是Ruby 2.0中引入的称为“关键字参数”的功能,如果您使用过Python或Objective-C,可能会更熟悉。标准参数列表如下所示:

def f(x)   # Example: f(1)
def f(x,y) # Example: f(1,2)

现在涉及默认值:

def f(x=1, y=2) # Example: f(0) or f(0, 3)

请注意,如果您想让f(,3)使用其默认值,则无法调用x

Ruby 2.0 关键字参数版本解决了此问题:

def f(x:)       # Example: f(x: 1)
def f(x:1, y:2) # Example: f(y: 3)

后面没有值的x:表示它是一个没有默认值的命名参数,因此是必需。调用没有该方法的方法会产生错误。