我有以下课程:
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:)
如果我摆脱了菜单中的两点,则测试无法通过。这个对象是什么?符号吗?
答案 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:
表示它是一个没有默认值的命名参数,因此是必需。调用没有该方法的方法会产生错误。