- 浏览: 3016721 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (430)
- Programming Languages (23)
- Compiler (20)
- Virtual Machine (57)
- Garbage Collection (4)
- HotSpot VM (26)
- Mono (2)
- SSCLI Rotor (1)
- Harmony (0)
- DLR (19)
- Ruby (28)
- C# (38)
- F# (3)
- Haskell (0)
- Scheme (1)
- Regular Expression (5)
- Python (4)
- ECMAScript (2)
- JavaScript (18)
- ActionScript (7)
- Squirrel (2)
- C (6)
- C++ (10)
- D (2)
- .NET (13)
- Java (86)
- Scala (1)
- Groovy (3)
- Optimization (6)
- Data Structure and Algorithm (3)
- Books (4)
- WPF (1)
- Game Engines (7)
- 吉里吉里 (12)
- UML (1)
- Reverse Engineering (11)
- NSIS (4)
- Utilities (3)
- Design Patterns (1)
- Visual Studio (9)
- Windows 7 (3)
- x86 Assembler (1)
- Android (2)
- School Assignment / Test (6)
- Anti-virus (1)
- REST (1)
- Profiling (1)
- misc (39)
- NetOA (12)
- rant (6)
- anime (5)
- Links (12)
- CLR (7)
- GC (1)
- OpenJDK (2)
- JVM (4)
- KVM (0)
- Rhino (1)
- LINQ (2)
- JScript (0)
- Nashorn (0)
- Dalvik (1)
- DTrace (0)
- LLVM (0)
- MSIL (0)
最新评论
-
mldxs:
虽然很多还是看不懂,写的很好!
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 -
HanyuKing:
Java的多维数组 -
funnyone:
Java 8的default method与method resolution -
ljs_nogard:
Xamarin workbook - .Net Core 中不 ...
LINQ的恶搞…… -
txm119161336:
allocatestlye1 顺序为 // Fields o ...
最近做的两次Java/JVM分享的概要
在Ruby里,给可能未定义或值为nil的变量设置一个默认初始值时,惯用法是使用||=的办法,例如:
这个例子里,无论a原本有没有定义,或者定义是什么都好,都会被当作是一个变量。如果原本a是一个有非nil非false值的变量,那么a的值不变;如果a原本是一个方法,那么作为方法名的a会被作为变量名的a所屏蔽,并且a被赋值为[]。
看下面这个例子:
可以看到变量名屏蔽方法名的行为。
OK,那有什么好说的呢?Ola Bini最近做过一个关于在JVM上创造自己的语言的讲演,其中有一部分是向与会者介绍Ruby。他演示的时候提到诸如a ||= 1没问题,但他一时以为在a还没定义的时候a = a || 1不行,在演示的时候稍微卡了一下。乍一看,要是根据他当时的思路,确实会觉得这个不行。
思路是:如果单独写a || 1,在a还没定义的时候,访问a的值会得到“未定义局部变量或方法”的错误;把这个放在赋值的右手边,就应该会在能够赋值之前就先遇到错误了。
但实际上,a ||= 1就是a = a || 1的简写,这两者在运行时的行为是一样的。那为什么单独写a || 1会出问题,而放在赋值的右手边就没事了呢?
因为Ruby要想办法知道一个名字到底是变量还是方法调用。最直观的判断依据是,执行到当前位置时这个名字有没有出现在赋值符号的左手边,有的话就把这个名字当作变量,没有的话就默认把这个名字当作方法;后一种情况中如果没有这个名字的方法,那就出错了。
像这样就会出错:
而这样就不会:
也就是说不用真的执行赋值,只要Ruby解析器能看到某个名字出现在赋值符号的左边就够了,就会创建一个这个名字的变量,未赋值时值为nil。
回到a = a || 1。这里Ruby先看到了a出现在赋值符号的左手边,于是创建出变量a,值为nil;接下来对赋值符号右手边求值,nil || 1的结果是1;然后完成赋值,a的值就是1了。单独的a || 1则没这待遇,得看前面有没有别的地方让a存在,不然就会出错。
以前在好多地方都有人提到过Ruby的这个行为。昨晚跟NS老兄聊的时候突然想起||的问题一时没想通,多得他提醒才又想起来了。记下来免得以后又糊涂……
a ||= [] a << 'first'
这个例子里,无论a原本有没有定义,或者定义是什么都好,都会被当作是一个变量。如果原本a是一个有非nil非false值的变量,那么a的值不变;如果a原本是一个方法,那么作为方法名的a会被作为变量名的a所屏蔽,并且a被赋值为[]。
看下面这个例子:
a ||= 1 puts a # 1 def b 2 end puts b # 2 puts b || 3 # 2 b ||= 3 puts b # 3 puts method(:b).call # 2
可以看到变量名屏蔽方法名的行为。
OK,那有什么好说的呢?Ola Bini最近做过一个关于在JVM上创造自己的语言的讲演,其中有一部分是向与会者介绍Ruby。他演示的时候提到诸如a ||= 1没问题,但他一时以为在a还没定义的时候a = a || 1不行,在演示的时候稍微卡了一下。乍一看,要是根据他当时的思路,确实会觉得这个不行。
思路是:如果单独写a || 1,在a还没定义的时候,访问a的值会得到“未定义局部变量或方法”的错误;把这个放在赋值的右手边,就应该会在能够赋值之前就先遇到错误了。
但实际上,a ||= 1就是a = a || 1的简写,这两者在运行时的行为是一样的。那为什么单独写a || 1会出问题,而放在赋值的右手边就没事了呢?
因为Ruby要想办法知道一个名字到底是变量还是方法调用。最直观的判断依据是,执行到当前位置时这个名字有没有出现在赋值符号的左手边,有的话就把这个名字当作变量,没有的话就默认把这个名字当作方法;后一种情况中如果没有这个名字的方法,那就出错了。
像这样就会出错:
def foo puts b # undefined local variable or method `b' b = 1 if false end foo
而这样就不会:
def foo b = 1 if false puts b # nil end foo
也就是说不用真的执行赋值,只要Ruby解析器能看到某个名字出现在赋值符号的左边就够了,就会创建一个这个名字的变量,未赋值时值为nil。
回到a = a || 1。这里Ruby先看到了a出现在赋值符号的左手边,于是创建出变量a,值为nil;接下来对赋值符号右手边求值,nil || 1的结果是1;然后完成赋值,a的值就是1了。单独的a || 1则没这待遇,得看前面有没有别的地方让a存在,不然就会出错。
以前在好多地方都有人提到过Ruby的这个行为。昨晚跟NS老兄聊的时候突然想起||的问题一时没想通,多得他提醒才又想起来了。记下来免得以后又糊涂……
评论
2 楼
RednaxelaFX
2009-04-07
1 楼
night_stalker
2009-04-05
油头粉面的 Ola 被卡住的时候真尴尬……
其实这个特性有好处的:如果不小心写错了一个字母,就会弹出一个error
其实这个特性有好处的:如果不小心写错了一个字母,就会弹出一个error
def fun very_long_parameter_nameeeeeeeeeeeee very_long_parameter_nameeeeeeeeeeee || 'bastard!' end
发表评论
-
字符串的一般封装方式的内存布局 (0): 拿在手上的是什么
2013-11-04 18:22 21373(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局
2013-11-01 12:55 0(Disclaimer:未经许可请 ... -
RubyConf notes
2011-11-08 19:10 0symmetric coroutine Fiber#trans ... -
ShanghaiOnRails第八次线下活动——你不需要知道的Ruby实现
2010-11-12 15:39 2790上个月底正好赶上参加了ShanghaiOnRails 第八次线 ... -
JRuby的运行模式
2010-11-01 11:21 0// 老的JRuby还是用org.jruby.evaluato ... -
你不需要知道的Ruby草稿
2010-10-27 11:25 0一些Ruby实现 Ruby 1.8 树遍历解释 Ruby 1 ... -
Ruby里的fiber/coroutine例子
2010-01-26 18:33 0Ruby 1.9开始支持fiber。与“fiber”一词的一般 ... -
JRuby使用技巧收集
2009-12-28 09:35 0java.lang.Thread.new { puts &qu ... -
特殊类型的eigenclass
2009-12-17 03:39 0Fixnum的实例没有eigenclass true、fals ... -
奇怪的参数
2009-12-08 02:25 0默认参数与闭包的组合 真正的问题不是只是默认参数看起来很诡异, ... -
MacRuby的执行模式
2009-12-07 07:41 0mailing-list macruby-devel http ... -
Rubinius的执行模型
2009-12-05 15:22 0Rubinius wants to help YOU make ... -
Ruby 1.8和1.9中String#hash的实现
2009-11-22 18:23 01.8 string.c int rb_str_hash(s ... -
To囧:拿你来测测Watir...
2009-11-21 22:38 3395iaimstar 写道@RednaxelaFX 你最近ruby ... -
[标题党] MagLev中GC类的真相……
2009-11-21 14:46 0注意到本文的标题:我是说“GC类”的真相,不是说GC的真相哦~ ... -
小试rubyzip的一个脚本
2009-11-17 20:42 3405呼,今天开始3天都是新人培训,总算可以抽点时间发一帖。 现在在 ... -
爬一下Google和百度看口碑对它们做的SEO效果如何
2009-11-09 00:27 0#!/usr/bin/env ruby require ... -
把Mechanize的html_parser改回到Hpricot
2009-11-08 14:45 3058记得我最初开始用Nokogir ... -
使用新的RubyInstaller
2009-11-07 02:37 0Hpricot的安装需要编译,需要devkit -
Ruby metaprogramming tech notes
2009-09-28 15:39 0class Builder def self.build ...
相关推荐
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
2024年中国MXene行业研究报告
附件是TensorFlow安装步骤,文件绿色安全,请大家放心下载,仅供交流学习使用,无任何商业目的!
ISO IEC 27001-2022 信息安全、网络安全和隐私保护信息安全管理系统要求.pdf
此试题是考试后回忆版本,你会发现是惊喜。恭喜你考个好成绩。
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
内容概要:这份资料包含了计算机二级公共基础知识速学教程的内容大纲,涵盖了数据结构与算法、程序设计基础、软件工程基础、数据库设计基础等多个章节。其中包括了算法复杂度、数据结构、栈、队列、链表、二叉树、查找、排序等内容,以及程序设计方法、软件工程概念、数据库设计原理等知识点。 适用人群:适合希望系统学习计算机二级公共基础知识的学生、计算机专业学习者、程序员、软件工程师以及对数据结构、算法和数据库设计感兴趣的人群,希望通过系统学习提升自己的计算机基础知识和技能。 使用场景及目标:该教程可用于计算机相关专业的课程学习、自学提升或备考计算机二级公共基础考试。学习者可以通过逐章学习和实践,掌握数据结构与算法、程序设计基础、软件工程基础和数据库设计基础等知识,提高自己在计算机领域的理论基础和实践能力。 其他说明:学习者在使用这份教程时,可以结合实际案例和练习题进行深入学习和巩固。建议按照章节顺序系统学习,理解各个知识点的概念和应用,并通过实践项目或练习加深对计算机基础知识的理解和掌握。通过系统学习,可以提升自己在计算机领域的专业水平和能力。
IEC 60364-7-722-2018 低压电气装置.第7-722部分:特殊装置或场所的要求.电动车辆的电源.pdf
ISO IEC 27021-2017 信息技术.安全技术.信息安全管理系统专业人员的能力要求.pdf
减速振动控制有限公司
2024年中国5G基站射频元件行业研究报告
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
云服务H13831题库HCIE CloudService SolutionsArchitect
大学生,数学建模,美国大学生数学建模竞赛,MCM/ICM,2023年美赛特等奖O奖论文
大模型简历模板通常包括个人信息、求职目标、教育背景、工作经历、技能专长、项目经验、荣誉奖项等内容。通过清晰的排版和详细的描述,展示出个人的专业能力和职业发展规划,吸引用人单位的注意。
SBC0001345K.8 SBC0001345K.10 手册
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
MAGLINK LX 控制台手册