Инициализируйте класс Ruby символом с двумя точками после (меню :) - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть следующий класс:

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 голосов
/ 05 ноября 2018

Это функция, представленная в 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: без указания значения означает, что это именованный аргумент без значения по умолчанию, поэтому требуется . Вызов метода без него приводит к ошибке.

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