首页
学习
活动
专区
工具
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声明的变量是不可变的,无法在循环中重新赋值。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【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就不存在隐式转换这种麻烦。

55620

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 使用的就是 &.)

35130

使用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都会每次迭代创建一个新的绑定,从而使循环体内创建的函数可以访问到相应迭代的值,而非最后一次迭代后的值

99620

20181013_ARTS_week16

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

40230

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

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

41830

一看就懂的var、let、const三者区别

至于 checkscope 函数中的变量 a 为什么输出 undefined,可以参阅《作用域和作用域链》章节。...这是因为使用 let/const 所声明的变量会存在暂时性死区。 什么叫做暂时性死区域?...2:常量的值不能改变 灵魂拷问 let const var 的区别?...参考答案: var 定义的变量,没有块的概念,可以跨块访问, 不能跨函数访问,有变量提升。 let 定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问,无变量提升,不可以重复声明。...const 用来定义常量,使用时必须初始化(即必须赋值),只能在块作用域里访问,而且不能修改,无变量提升,不可以重复声明。 最初 JS 中作用域有:全局作用域、函数作用域。没有块作用域的概念。

46120

图解 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 的原型属性. 原型链的内容就到这里, 更多关于继承的内容, 会在下一篇讲解.

86620

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 中常被当作栈,队列,集合等数据结构的实现方式,会有批量的数据以待遍历。

41820

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.3K20

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

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

44620

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

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

6.5K30

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 为常量,当对齐运行 ++ 运算的时候报错。

59510

我从来不理解JavaScript闭包,直到有人这样向我解释它

按照之前的说法,这个 food 变量应该当 eat 函数调用完后就销毁,后续为什么还能通过调用 look 方法访问到这个变量? 这就是因为闭包起了作用。...(2)为什么当外部函数的上下文执行完以后,其中的局部变量还是能通过闭包访问到? 其实用上一个问题的答案再延伸一下,这个问题的答案就出来了。...那么为什么说每一个函数都是一个闭包?...但是使用闭包的一部分原因,是我们选择主动把一些变量封闭闭包中,因为可能在以后还需要使用这些变量。 把这些变量放在闭包中和放在全局作用域中,对内存方面的影响是一样的,所以这里并不能说成是内存泄漏。...你看,循环中的 setTimeout 访问了它的外部变量 i,形成闭包。  i 变量只有 1 个,所以循环 3 次的 setTimeout 中都访问的是同一个变量。

30850

前端日常总结

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

1.3K20

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

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

15711

负载均衡调度算法大全

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

6.3K30
领券