首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在ruby循环中var可以工作,而const不能呢?

在Ruby中,varconst是不同的变量声明方式。var声明的变量是可变的,而const声明的变量是不可变的。

在循环中,每次迭代都会创建一个新的作用域。当使用var声明变量时,每次迭代都会创建一个新的变量实例,因此可以在循环中重新赋值。例如:

代码语言:txt
复制
for var in 1..5
  var = var + 1
  puts var
end

输出结果为:

代码语言:txt
复制
2
3
4
5
6

而当使用const声明变量时,每次迭代都会尝试创建一个新的常量,但由于常量是不可变的,所以会导致错误。例如:

代码语言:txt
复制
for const in 1..5
  const = const + 1
  puts const
end

会抛出错误:

代码语言:txt
复制
dynamic constant assignment (SyntaxError)

因此,在Ruby循环中,var可以工作,而const不能工作的原因是const声明的变量是不可变的,无法在循环中重新赋值。

相关搜索:为什么这可以在for循环中工作,而不能在forEach中工作?(数组不是构造函数错误)为什么在VBA中多个subs不能一起工作,而单独工作呢?为什么getCurrentInterruptionFilter BroadcastReceiver可以在快速设置中工作,而不能在设置中工作?为什么这些图标中的一个可以工作,而另一个不能呢?为什么spark作业在zepplin上不能工作,而它们在使用pyspark shell时可以工作为什么display: flex可以在<body>上工作,而不能在<html>标签上工作?为什么ob_flush可以在apache localhost上工作,而不能在远程上工作?为什么hangfire仪表板可以在开发中工作,而不能在部署中工作为什么在python中使用xlrd打开工作簿时,变量可以工作,而列表不能工作?在ngStyle和ngClass中,为什么ngStyle不能在没有方括号的情况下工作,而ngClass可以呢?为什么这个合并排序代码可以在python中工作,而不能在javascript中工作?为什么我的导入可以在pycharm中工作,而不能在命令行中工作?为什么这段代码在phpadmin/sql中可以工作,而在python代码中却不能呢?为什么向函数发送**head可以在反转SLL时工作,而*head在C中不能?为什么这个查询可以在mongo shell中工作,而不能在node mongo驱动程序中工作?为什么像箭头函数这样的方法可以在react类中工作,而不能在普通类中工作?为什么我的iFrame可以在本地主机上工作,而不能在生产环境中工作?为什么这段代码可以在我有的测试网站上工作,而不能在本地页面或jfillde上工作?为什么这个下拉表单筛选器可以在本机表上工作,而不能在ODBC链接表上工作?我怎样才能知道为什么/如何一些LINQ查询可以相互工作,而另一些则不能呢?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【ES】199-深入理解es6块级作用域的使用

(name); 同样的const不能重复声明,如下例: var name = 'eveningwater'; //错误,不能重复声明 const name = 'loho'; 但也可以不同作用域中重复声明...} 尽管const声明与let声明有太多相似的地方,但const声明也有一处与let声明不同,那就是const声明的变量不能被赋值,无论是非严格模式下还是严格模式下,都不能const声明的变量进行赋值...100 我们可以使用let声明将变量i限制环中,此时再在循环作用域之外访问变量i就会报错了,因为let声明已经为循环创建了一个块级作用域。...,因此不能const声明用在for循环中,但可以const声明用在for-in或者for-of循环中。...for-of循环是es6的新增的坏。。 7.全局作用域绑定 let,const声明与var声明还有一个区别就是三者全局作用域中的行为。

3.7K10
  • 盘点六个阅读React源码后get到的基础知识

    阅读源码的终极目的还是应用,在这个想法下,我盘点了一些可以快速工程中应用的( 或许冷门 )知识,希望读者可以get到 2 盘点 2.1 多层循环中跳出最外层 我曾在部分场景中,遇到多层循环需要一次性跳出的场景...这样并不能成功跳出。...为什么,我当时就懵了,虽然我知道使用void 0===undefined,但是不曾使用过void这个关键字。 所以,我进行了一定的探索。最终发现了一个惊人的事件。...undefined不是一个关键字,这玩意儿是全局变量的一个属性,低版本浏览器中全局undefined可以被改写,现代浏览器的局部作用域中同样可以被改写。...const obj={a:'qqq',1:'www'}; Object.keys(obj); // ['1','a'] 相比之下,使用Map就不存在隐式转换这种麻烦。

    59220

    107.精读《Optional chaining》

    Optional chaining 可以解决为了容错写过多重复代码的问题: var street = user.address?....已有实现调研 Optional chaining C#、Swift、CoffeeScript、Kotlin、Dart、Ruby、Groovy 已经实现了,且实现方式均有差异,可以看到每个语言实现语法时都是有取舍的...语法可以快速满足,因此这个特性的讨论也被搁置了。 余下的 Q&A 大部分 Q&A 在上面的解读都有提及,下面列出剩余的两个 Q&A: 为什么语法是 ?. 不是 .? ?...foo : bar js 中,1. 等价于 1,那么这就是一个标准的三元运算表达式,因此 .? 语法会产生歧义,只能选择 ?.。 为什么 null?.b 的结果不是 null ? 由于 ....不是 a&.b(Ruby 使用的就是 &.)

    38730

    使用letconst定义变量的场景

    为什么使用Let,const定义变量更节省内存?...const name; 06 关于循环中const声明 代码中,经常会用到for循环,需要初始化变量,对于for循环来说,可以初始化时使用const,但要是更改这个变量的话,它就会抛出错误 var...循环中使用const时的行为与使用let一致,如果使用const定义的常量,后续不会被修改,那么可以使用 var arrs = []; var object = { a: true, b...window对象),使用var会覆盖一个已经存在的全局变量 let,const和class命令声明的全局变量不属于全局对象的属性,声明的变量不会提升,而且只可以声明这些变量的代码块中使用 不能在声明变量前访问它们...,因为常量不能被改变 for..in,fo..of循环中,let,const都会每次迭代创建一个新的绑定,从而使循环体内创建的函数可以访问到相应迭代的值,而非最后一次迭代后的值

    1K20

    20181013_ARTS_week16

    removeDuplicates = function (nums) { if (nums.length == 0) return 0; var i = 0; for (var...,以及要在原数组中改,没注意最后只要前 n 位是无重复的就可以了。...,const key; 不但没赋值,而且后面把 const 的 key 用到循环中也是不对的。...像上面那个例子是国外一个网站的代码,有时候是一些技术书籍的代码,包括我们平常在写博客的时候也经常会遇到自己没有实际验证过,只是关注了想表达的某个知识点,没注意到辅助的代码有些问题。...我认为应该要做到代码运行起来没问题, 至少不能报错吧。 然后写示例过程中遇到的一些辅助代码也应该做适当的解释,这样一方面有助于自己更深刻的理解,另一方面读者也会更清楚。

    42630

    Vue是怎样监听数组的变化的?

    工作如何挤出时间学习?一道面试题其实我们并不是要你把答案都记下来,而是把其中的思想学习到。就像你接触一个新的领域react,你也一样可以把基本思想提炼出来。面试题: Vue是如何对数据进行监听的?...01 对象数据是怎么被监听的vue2.x版本中,数据监听是用过Object.defineProperty这个API来实现的,我们可以来看一个例子var text = 'vue';const data...我们当然可以触发函数的时候做我们自己想做的事情,这也就是“劫持”操作。...那么Vue是怎么做的?import { def } from '.....参考:前端vue面试题详细解答Vue为什么不能检测数组变动并不是说 JS 不能支持响应式数组,其实JS是没有这种限制的。

    43530

    JavaScript之选择控制语句(if,switch,while,do-while,for循环)及很重要的表达式真与假

    (1,2) 实际的程序代码中:if的使用可以说无处不在 ?...,用全等===符号,express是一个用来与 case 子语句匹配的表达式 case子句必须是常量表达式,case子句可以有多个,但是每一个case子句的取值不能够重复 default子句类似于if语句中的...要在循环中执行多条语句,可以使用块语句({ ... })包住多条语句 注意:使用break语句条件表达式计算结果为真之前停止循环 如下代码所示:求1-100之和 var number = 1;...与while的区别是: whle循环是先判断后执行,do..while是先执行,后判断 当第一次条件不成立时,while不会执行,do-while无论是否成立都至少会执行一次 循环中每次都会计算的表达式...,也可以定义在外头,但是个人强烈建议定义在里头,不要写让人猜的代码,更不要写奇奇怪怪的代码,让人看不懂,不是炫技,而是挖坑,本质上就是垃圾代码 var sum = 0; function getSum

    2.1K20

    Vue是怎样监听数组的变化的?

    为何工作几年的基础越来越弱? 工作如何挤出时间学习? 一道面试题 其实我们并不是要你把答案都记下来,而是把其中的思想学习到。就像你接触一个新的领域react,你也一样可以把基本思想提炼出来。...01 对象数据是怎么被监听的 vue2.x版本中,数据监听是用过Object.defineProperty这个API来实现的,我们可以来看一个例子 var text = 'vue'; const data...我们当然可以触发函数的时候做我们自己想做的事情,这也就是“劫持”操作。...那么Vue是怎么做的? import { def } from '.....Vue为什么不能检测数组变动 并不是说 JS 不能支持响应式数组,其实JS是没有这种限制的。 数组 JS 中常被当作栈,队列,集合等数据结构的实现方式,会有批量的数据以待遍历。

    49520

    图解 JavaScript 原型与原型链

    原型平时工作中用得比较少, 但原型是 JavaScript 中的基础, 是构建大型应用, 框架不可或缺的一环, 是你写代码时, 不知不觉就应用上了的一个最基础的知识....又比如你使用下面这些代码的时候: // class class Foo extends React.Component; // 访问原型方法 const bar = {}; bar.hasOwnProperty...我们 new 出 foo 对象后, 并没有给 foo 对象添加任何方法, 但我们依然能从 foo 对象中调用 toString(), hasOwnProperty() 等方法. 这是为什么?..., __proto__ 就是用来查找属性和方法的, 从上图的链条来看, 我们 foo 这个对象中, 查找 toString 方法, 没找到, 就着 foo....这就是原型链, 我们也可以说, Foo 继承了 Object, 所以 foo 中能访问到 Object 的原型属性. 原型链的内容就到这里, 更多关于继承的内容, 会在下一篇讲解.

    90520

    Android为什么不能在子线程更新UI

    如果不做这个校验,是不是我也可以正常在子线程更新UI 但是google为什么要这样去设计 ViewRootImp是onActivityCreated方法后面创建的吗 为什么一定需要checkThread...为什么不加锁 为什么一开始Activity的onCreate方法中创建一个子线程访问UI,程序还是正常能跑起来 Android中子线程真的不能更新UI吗 保证上述条件1成立不就可以避免checkThread...为什么还需要开启消息坏 使用子线程更新UI有实际应用场景吗 Android为什么不能在子线程更新UI? // Android中为什么子线程不能更新UI?...ViewRootImpl是Activity的onResume()方法后面创建出来的,所以onResume之前的UI更新可以子线程操作不报错,因为这个时候ViewRootImpl还没有创建,没有执行...为什么还需要开启消息坏? 条件 1 可以避免检查异常,但是无法保证 UI 可以被绘制出来。 条件 2 可以让更新的 UI 效果呈现出来。

    1.4K20

    还没有理解let 和 const的用法和区别吗,几百字让你立马搞懂

    , 他们与 var 有所区别 let 命令 我们都知道for循环中,我们命名的变量 i 一般都只是为了在这个循环中使用,才临时命名的, 我们希望循环结束后,这个变量就消失, 但是却相反,用 var 命名的变量...// 这里是循环外输出的i 但是如果我们 for 循环中,用到 let 去命名变量会怎么样?...命名导致的变量泄露的问题了, 其实它的本质就是作用域, let 只作用于他自身所在的代码块内, var 是针对全局都有效的。...命名的变量只存在于那个代码块内,到外部就访问不到了, var 就是针对全局命名的。...其实 const 命名变量以后, 也不是说就真的无法改变了, 因为const命名时其实是把箭头指向了内存中的一个对象, 只要不改变这个对象地址, const 命名的变量还是可以变化的,例如: const

    45720

    常见负载均衡策略「建议收藏」

    ,从而协同完成工作任务。...基于这个前提,轮调度是一个简单而有效的分配请求的方式。然而对于服务器不同的情况,选择这种方式就意味着能力比较弱的服务器也会在下一轮循环中接受轮,即使这个服务器已经不能再处理当前这个请求了。...这为服务器提供了一个‘过渡时间’以保证这个服务器不会因为刚启动后因为分配的连接数过多超载。这个值 L7 配置界面设置。...和加权轮调度方法一样,不正确的分配可以被记录下来使得可以有效地为不同服务器分配不同的权重。...然而,流量非常低的环境下,服务器报上来的负载值将不能建立一个有代表性的样本;那么基于这些值来分配负载的话将导致失控以及指令震荡。 因此,在这种情况下更合理的做法是基于静态的权重比来计算负载分配。

    6.8K30

    JavaScript 中的 let 和 const

    JavaScript 中,是没有块级作用域的概念的,代码块内声明的变量,其作用域是整个函数作用域不是块级作用域。...let 和 const 作为加强版的 var,让程序员写出更安全,更高效的代码。 let 用 let 定义的变量与 var 有三个区别:块级作用域、不会变量提升,不能定义同名变量。... ES6 之前,是没有块级作用域的说法的: while (true) { var name = 'Leo' break } console.log(name) // Leo while 体里面定义的变量代码块外也可以访问到...console.log(value) // undefined if (true) { let value = '555' } 循环绑定 var 声明使得环中创建和使用函数总是有一些问题。... const 不能用于下面的循环,由 const 声明的 i 为常量,当对齐运行 ++ 运算的时候报错。

    62810

    前端日常总结

    const声明的变量会被认为时常量constant,表示它们的值被设置完成后就不能再被改变了 所以啊,所有的const声明的变量都需要(声明时)进行初始化: // 有效的常量 const da = 12...如果你全局作用域上使用let或者时const,会在全局作用域上创建新的绑定,但不会被添加到全局对象上,不能使用let或const来覆盖一个全局变量,你只能用来起到屏蔽效果。...let 和 const能够 for-in 和 for-of 循环中,每一次迭代时创建一个新的绑定,表示 循环体内创建的函数可以使用 当前迭代所绑定的循环变量值。...不向使用var 那样,统一使用循环结束时的变量值。 for循环中 使用 let 声明 成立,使用const声明会导致错误哦。...用对象来代替传统数组的做法意味可以通过元素的名字不是下标数字来引用它们。 变量作用域:分全局,局部。 全局变量,可以脚本中的任何位置被引用。

    1.4K20

    【前端技能树-需要避免的坑】Javascript 开发者容易花田里犯的错

    但是这是为什么? 让我们重新更详细地检查这段代码一下,发现: 每个 theThing 对象都包含大小为 1MB 的 longStr 对象。...而且,它只replaceThing 的主体和未使用的函数中被引用,未使用的函数实际上从未使用过。 所以再次疑惑为什么这里会有内存泄漏。...添加 DOM 元素是一项开销很大的操作,连续添加多个 DOM 元素的代码效率很低,很可能不能很好地工作。... for 循环中错误地使用函数定义 考虑这段代码: const elements = document.getElementsByTagName('input'); const n = elements.length...方法的引用,这样我们就可以仅仅通过whoAmI() 不是更长的 obj.whoAmI() 来访问它: const whoAmI = obj.whoAmI; 为了确保我们已经存储了一个对函数的引用,让我们打印出新的

    19011

    负载均衡调度算法大全

    基于这个前提,轮调度是一个简单而有效的分配请求的方式。然而对于服务器不同的情况,选择这种方式就意味着能力比较弱的服务器也会在下一轮循环中接受轮,即使这个服务器已经不能再处理当前这个请求了。...这为服务器提供了一个‘过渡时间’以保证这个服务器不会因为刚启动后因为分配的连接数过多超载。这个值L7配置界面设置。...根据服务器整体负载情况,有两种策略可以选择:常规的操作中,调度算法通过收集的服务器负载值和分配给该服务器的连接数的比例计算出一个权重比例。...和加权轮调度方法一样,不正确的分配可以被记录下来使得可以有效的为不同服务器分配不同的权重。...然而,流量非常低的环境下,服务器报上来的负载值将不能建立一个有代表性的样本;那么基于这些值来分配负载的话将导致失控以及指令震荡。因此,在这种情况下更合理的做法是基于静态的权重比来计算负载分配。

    6.3K30

    React源码中的useState,useReducer

    热身准备正式讲useState,我们先热热身,了解下必备知识。为什么会有hooks大家都知道hooks是函数组件的产物。之前class组件为什么没有出现hooks这种东西?答案很简单,不需要。...两套hooks我们刚开始学习使用hooks时,可能会有疑惑, 为什么hooks要在函数组件的顶部声明,不能在条件语句或内部函数中声明?...这样做是不行的,因为setState入参可以是基础类型也可以是函数, 如果传入的是函数,它会依赖上一个setState的值来完成更新操作,下面的代码就是上面的循环中的reducerfunction basicStateReducer...返回update后的[newState, dispatchAction].还有两个问题为什么setState后不能马上拿到最新的state的值?...看完这篇文章, 我们可以弄明白下面这几个问题:为什么setState后不能马上拿到最新的state的值?多个setState是如何合并的?setState到底是同步还是异步的?

    1K30
    领券