Ruby默认参数:静态还是动态?

时间:2018-12-14 16:12:30

标签: ruby-on-rails ruby

Ruby方法中的默认参数是否静态?当默认参数是动态日期(例如Date.today)时,这很重要。考虑一下Rails应用程序中的以下示例:

class User < ApplicationRecord

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

end

自启动Rails服务器起,默认的date_of_interest日期将始终是相同的静态日期吗?

或者:是否会始终在调用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 :(得分:3)

  

我最感兴趣的是默认方法参数是否动态生成。

对此进行测试很容易:

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),子子部分中指定ISO Ruby Language Specification的步骤 i)

答案 1 :(得分:2)

它是动态的,因为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

答案 2 :(得分:0)

它不是静态的,每次都会评估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