加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 在传递给RSpec共享示例的块的情况下,启用`let`分配形式

发布时间:2020-12-17 02:40:02 所属栏目:百科 来源:网络整理
导读:在RSpec中,为共享示例提供值的技术之一是使用let来定义该示例使用的变量,如 this documentation中所述. 目前,传递给形式参数的值优先于let建立的任何值,如以下示例所示: shared_examples_for "foo" do |x1| specify {puts [x1,x2,x3].inspect}enddescribe "
在RSpec中,为共享示例提供值的技术之一是使用let来定义该示例使用的变量,如 this documentation中所述.

目前,传递给形式参数的值优先于let建立的任何值,如以下示例所示:

shared_examples_for "foo" do |x1|
  specify {puts [x1,x2,x3].inspect}
end

describe "" do
  let(:x1) {3}
  let(:x2) {3}
  let(:x3) {3}
  it_behaves_like "foo",1 do
    let(:x1) {2}
    let(:x2) {2}
  end
end

# => [1,2,3]

我的问题是改变RSpec语义是否可能/合理/合乎需要,以便通过传递块内部let设置的变量优先于传递的参数,上面输出[2,3].这将允许将“简单”值作为参数传递,并通过块设置更复杂的值.

解决方法

use let to define a variable

让我们不定义变量;它定义了一个memoized帮助方法.区别很重要,因为ruby以不同的方式处理变量和方法.具体而言,局部变量(例如,shared_examples_for块中的x1块arg)始终优先于同名方法,除非您使用self.x1明确表示您正在发送消息.

那么,回答你的问题:不,你问的是不可能的.我认为这也不可取;当有名称冲突时,局部变量总是“赢”对于能够推断你的代码是非常重要的.如果情况并非如此,请考虑重新调查.假设你开始使用这段代码:

# in superclass.rb
class Superclass
end

# in subclass.rb
class Subclass < Superclass
  def do_something(name)
    # do something with the `name` variable
  end
end

在未来的某个时刻,Superclass会更新为具有名称方法:

class Superclass
  def name
    "superclass name"
  end
end

如果ruby没有优先考虑局部变量而不是方法,则子类#do_something方法会因对Superclass的无关更改而中断.局部变量始终优先的事实意味着您可以更容易地推断出代码的作用而不必担心改变某些远程代码突然导致特定标识符重新绑定到方法而不是局部变量.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读