Аргументы Ruby по умолчанию: статический или динамический? - PullRequest
0 голосов
/ 14 декабря 2018

Аргументы по умолчанию в методах ruby ​​статичны?Это имеет значение, когда аргументы по умолчанию означают динамическую дату, например Date.today.Рассмотрим следующий пример в приложении rails:

class User < ApplicationRecord

  def eligible_to_vote?(date_of_interest = Date.today)
    p date_of_interest
  end

end

Будет ли дата по умолчанию date_of_interest всегда совпадать со статической датой с момента запуска сервера rails?

Или: будет ли он всегда динамически захватывать «сегодняшнюю дату» в контексте даты, когда был вызван метод eligible_to_vote??

Я знаю, что следующее наверняка динамически захватит Date.today:

# Always dynamically sets `date` variable when no argument passed in
class User < ApplicationRecord

  def eligible_to_vote?(date_of_interest = nil)
    date = date_of_interest.present? ? date_of_interest : Date.today
    p date_of_interest
  end

end

Больше всего меня интересует, генерируются ли аргументы метода по умолчанию динамически или нет.Каким бы ни был ответ, было бы неплохо иметь официальную ссылку, чтобы ответить и на этот вопрос.Спасибо!

Ответы [ 3 ]

0 голосов
/ 14 декабря 2018

Он динамический, потому что Ruby интерпретируется, а не компилируется.

✎ require 'date'
✎ def test param = DateTime.now
    puts param
  end
✎ 3.times { test; sleep(1) }
2018-12-14T18:10:08+01:00
2018-12-14T18:10:09+01:00
2018-12-14T18:10:10+01:00
0 голосов
/ 14 декабря 2018

Больше всего меня интересует, генерируются ли аргументы метода по умолчанию динамически или нет.

Было бы тривиально легко проверить это:

def are_default_arguments_evaluated_every_time?(optional_parameter = puts('YES!')) end

are_default_arguments_evaluated_every_time?
# YES!

are_default_arguments_evaluated_every_time?
# YES!

Если аргументы по умолчанию были оценены во время определения метода, это напечатало бы YES! только один раз и перед вызовом метода.Если аргументы по умолчанию вычисляются только при первом вызове, а затем кэшируются, то при первом вызове метода выдается YES! только один раз.

Каким бы ни был ответ, было бы неплохо иметьнекоторые официальные ссылки, чтобы ответить и на этот вопрос.

Это указано в разделе §13.3.3 Вызов метода , шаг h) , подшаг 7) , подэтап i) спецификации ISO Ruby Language .

0 голосов
/ 14 декабря 2018

это не статично, Date.today оценивается каждый раз.

Возьмем, к примеру:

def foo(some_var = boo)
  p some_var
end

def boo
  p "this is boo"
  Date.today
end

Когда вы запускаете сегодня

foo 
# "this is boo"
# Fri, 14 Dec 2018
foo 
# "this is boo"
# Fri, 14 Dec 2018

Когда вы запускаетезавтра

foo 
# "this is boo"
# Fri, 15 Dec 2018
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...