`
量产型人型自走炮
  • 浏览: 8488 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论
阅读更多
恩这个我知道
举个例子Enumerable#find
def find
 for i in 0...size
  value = self[i] 
  return value if yield(value)#我怎么确定这个return具体跳到哪里
 end
return nil 

分享到:
评论
85 楼 RednaxelaFX 2009-04-17  
night_stalker 写道
那个{}是闭包,可以理解。
看来 $1 的作用域大概比 local variable 更小……

那例子其实正好说明$1与local是一样的,被闭包捕获而没有干扰到yield一侧的方法里的binding。
不过昨晚你们似乎已经讨论解决问题了……我正准备回这条的时候宿舍就断电了 T T

量产型人型自走炮 写道
把作用域定义交给程序员,还真是个特别的设计XSK

没啦,Ruby在方法内实现了词法作用域,而且用很有趣的办法对“全局”给出了自圆其说的办法。昨晚时间不足所以没码字,现在码点:
###
# local scope of Object
###

class Foo

  ###
  # local scope of Foo
  ###

  def bar

    ###
    # local scope of Foo#bar
    ###

  end

end

###
# local scope of Object
###

可以把Ruby中的$、@、@@与没有前缀的变量看成位于不同的名字空间,于是它们只要前缀不同,即使同名也不会混在一起。然后,变量与方法也不在同一个命名空间里。
在Ruby访问一个没有前缀的名字时,这个名字要么得是方法自己的局部变量或闭包捕获的变量,要么可以是作用域链上存在的同名方法。Ruby中所有局部作用域都最终能顺着作用域链找到Object的局部作用域,所以在“全局”的地方定义的方法看上去在什么地方都能用。
关于作用域,或者更准确的说,关于Ruby的名字解析(name resolution),还是读一下《The Ruby Programming Language》的7.8、8.3、8.4等章节吧,解释得很清楚。

可以一囧的细节还多的是呢……
C:\Users\rednaxela-w7b>irb
irb(main):001:0> class F
irb(main):002:1>   yield
irb(main):003:1> end
LocalJumpError: no block given
        from (irb):2
irb(main):004:0> quit

C:\Users\rednaxela-w7b>e:

E:\>cd build_area\ruby191\bin

E:\build_area\ruby191\bin>irb
irb(main):001:0> class F
irb(main):002:1>   yield
irb(main):003:1> end
SyntaxError: (irb):2: Invalid yield
        from (irb)
irb(main):004:0> quit
84 楼 量产型人型自走炮 2009-04-16  
只要没有$、@、@@开头的都肯定是局部的。即便那个变量是在“全局”作用域里定义的也一样

把作用域定义交给程序员,还真是个特别的设计XSK
83 楼 量产型人型自走炮 2009-04-16  
"10:20 pm" =~ /(\d\d):(\d\d)/
def foo
 "22:10 pm" =~ /(\d\d):(\d\d)/
  yield
  puts  $1
  
end
foo{puts $1}
puts $1


貌似还真是= =不同作用域都不能互相影响 哦丫死米 民那~
10
22
10
82 楼 night_stalker 2009-04-16  
救星来了! 经您一说,我也明白了~~
81 楼 night_stalker 2009-04-16  
那个{}是闭包,可以理解。

看来 $1 的作用域大概比 local variable 更小……
80 楼 RednaxelaFX 2009-04-16  
抱歉,我10点离开机房,11点半断电,这中间没啥时间上网……明儿再过来仔细看看。
不过你们似乎在讨论作用域的问题?$&、$`、$'、$1到$9,这些都是特殊变量,虽然有$开头但其实不是全局变量。它们是thread-local的,所以不会在多个线程中被共享;它们只在每个局部作用域用有效,也就是说在什么地方调用过=~或者match之类,那个局部作用域里就可以用前面提到的几个特殊变量。

a = 1
def f
  puts a
end

这段代码里,前一个a是Object的局部变量(要注意类定义的内部、方法定义之外的地方,其实也是局部作用域来的,就像一个方法一样)。
在f里要访问的a是f自己的局部变量,或者是外面的名为a的方法,还没被定义过,自然是不行。
而$1、$2的行为只不过是跟上面的a的问题一样。

Ruby里无论什么地方定义的变量,只要没有$、@、@@开头的都肯定是局部的。即便那个变量是在“全局”作用域里定义的也一样;“全局”作用域就是Object内部的局部作用域而已。
79 楼 night_stalker 2009-04-16  
我猜想,$1 在 foo 里面是 nil 的原因是:
$1 是被设计为线程安全的,即一个线程的 $1 变化,不会影响到别的线程的 $1。

而线程一般是这样写的:
Thread.new do
  #xxx
end

估计为了使它们不相互影响,就GFW了……
78 楼 量产型人型自走炮 2009-04-16  
"22:10 pm" =~ /(\d\d):(\d\d)/
def foo
  yield
  puts  $1
  
end


foo{puts $1}
puts $1


22
nil
22


好玩了 lol
77 楼 night_stalker 2009-04-16  
量产型人型自走炮 写道

x位置调转也没关系= =


对,要知道 ruby 是动态语言,用的时候才会检查东西有没有定义。(不然没有接口根本写不了代码。)
76 楼 量产型人型自走炮 2009-04-16  
好了...这问题解决了
还剩$1 $2的问题 搞清楚睡觉-v-
75 楼 量产型人型自走炮 2009-04-16  
def x
  b = 2
  puts defined? b
  puts $a
end
$a = 111
x

位置调转也没关系= =
74 楼 night_stalker 2009-04-16  
量产型人型自走炮 写道

引用还有离奇的事情……输出 local-variable 有错吗?

好像是我的问题,嗯……这样就好……
73 楼 量产型人型自走炮 2009-04-16  
那个a不能用不是因为命名的问题吧= =
$a = 111
def x
  b = 2
  puts defined? b
  puts $a
end
x

输出local-variable
111
我X 编译器这个都要管
72 楼 night_stalker 2009-04-16  
RednaxelaFX 写道

量产型人型自走炮 写道就昨天你那个sample 跳回主作用域的(这个怎么描述来着..)irb里面报错jruby正常退出ps:公开百合遇上瓶颈了= =有什么线代和分形几何的书推荐么?上了大学之后我数学就荒废了……数学别问我。要做题的话某套11本的习题很强悍,但名字我想不起来了 =v= 只记得是俄国人写的经典习题集。


吉米多维奇…… 我们普物物理老师在IBM做硬盘的,上课和大家说“你们吉米多维齐都做完了,所以布置难一点的作业没关系“”,全班囧倒
71 楼 量产型人型自走炮 2009-04-16  
引用
还有离奇的事情……

输出 local-variable 有错吗?
70 楼 night_stalker 2009-04-16  
match 后 马上用 $1, $2 是没问题的,一般不会调个函数用...

另外 meta class 的行为和 class 有区别..
69 楼 night_stalker 2009-04-16  
ruby 的程序执行是在一个 Object 中进行 eval 的,

所以有:
局部变量
实例变量
类变量
全局变量
special 变量..

还有离奇的事情……
def x
  b = 2
  puts (defined? b)
end
# => nil


被你一问,问出我的学艺不精了……
68 楼 量产型人型自走炮 2009-04-16  
恩 书上说实际上是matz早期为了迎合perl用户做的折中(或者说黑历史= =)...好孩子还是用
md = /(\d)(\d)/.match("22:10")
md[1] 
md[2]
md.pre_match
md.post_match

比较好= =
re = /(\d+):(\d+)/
md1 = re.match("21:10 pm")
md2 = re.match("10:22 am")
puts $1,$2
$~ = md1
puts $1,$2

output
10
22
21
10
67 楼 night_stalker 2009-04-16  
量产型人型自走炮 写道
...前面的函数用后面定义的变量是不成的


和前后无关,可以试试

irb(main):051:0> a=2
=> 2
irb(main):052:0> def u;a;end
=> nil
irb(main):053:0> u
NameError: undefined local variable or method `a' for #<Object:0x284f9e8 @a=2>
        from (irb):52:in `u'
        from (irb):53
        from :0
66 楼 量产型人型自走炮 2009-04-16  
night_stalker 写道

嗯…… 应该说 $1, $2 是 special variables,没说是 global 吧.

de su ka ra?special variables所以不能在函数里面访问?= =这不对吧 有什么规律没有

相关推荐

    如何在QQ上使用美图聊聊?.docx

    在较早的版本中,你可能会直接找到“图片”选项,但在2013年4.2.0版及以上的新版QQ中,必须通过“拍照”功能才能触发美图聊聊。 3. **选择美图聊聊**: 在选择拍照后,系统会弹出一个窗口,此时你需要选择“美图聊...

    安卓开发-百度推聊应用.zip.zip

    2. **即时通讯技术**:百度推聊应用可能使用了自定义的消息协议或者基于XMPP、MQTT等协议进行实时通信。 3. **数据存储**:可能使用SQLite数据库存储用户信息、聊天记录等数据,或者利用sharedPreferences存储轻量...

    百度推聊应用.zip

    【标题】"百度推聊应用.zip" 是一个包含Android源码的学习资源,它可能是百度公司某款聊天应用的源代码示例。通过分析这个压缩包,我们可以深入理解Android应用程序的开发流程,掌握核心组件和功能的实现。 【描述...

    Android应用源码之百度推聊应用.zip

    推聊应用可能使用SQLite来保存用户信息、聊天记录等。研究数据库相关的代码,可以学习到如何创建表、插入/查询数据,以及如何使用ContentProvider进行数据共享。 5. **网络通信**:为了实现实时聊天,应用可能采用...

    安卓Andriod源码——百度推聊应用.zip

    这意味着我们可以期待在这个压缩包中找到用Java或Kotlin编写的Android工程文件,包括Activity、Service、BroadcastReceiver等组件,以及与百度Push SDK相关的配置和接口调用。 【标签】:“安卓”、“android”、...

    应用源码之百度推聊应用.zip

    《深入剖析:百度推聊应用源码学习》 在Android开发领域,源码学习是提升技术能力的重要途径。本资源“应用源码之百度推聊应用.zip”为我们提供了一个宝贵的实践平台,它涵盖了JAVA ANDROID的相关知识,适合作为...

    Android高级应用源码-百度推聊应用.zip

    【标题】"Android高级应用源码-百度推聊应用.zip" 涉及的主要知识点是Android应用程序开发,尤其是使用百度推送服务(Baidu Push SDK)进行实时通讯的应用实践。这个压缩包包含的是一个完整的Android项目源码,可以...

    安卓Android源码——百度推聊应用.zip

    【压缩包子文件的文件名称】:“Baidu-Push-SDK-Android-L2-3.2.0”是百度推送服务的SDK版本号,表示这个压缩包内包含了特定版本(L2,可能是某个特定功能的代号,3.2.0是具体的版本号)的Android版百度Push SDK。...

    QQ轻聊版7.3正式版发布.docx

    6. **与普通版共存**:轻聊版与普通版QQ可以同时存在于同一台电脑上,用户可以根据不同场景切换使用,满足多样化的使用需求。 7. **好友列表和聊天界面**:好友列表清晰明了,每个联系人的信息简洁直观;聊天界面则...

    QQ轻聊版好不好用.docx

    这意味着用户在使用轻聊版进行聊天时,不会遇到恼人的弹窗广告,不会在聊天窗口中看到任何图文或文字广告,从而保证了聊天过程的纯粹性和专注度。对于经常被广告打扰的用户来说,这一点无疑具有极大的吸引力。 其次...

    【JavaScript源代码】Vue在H5 项目中使用融云进行实时个人单聊通讯.docx

    在H5项目中集成实时个人单聊通讯功能,可以借助第三方服务如融云(RongCloud)。融云提供了一套API和服务,使得开发者能够方便地实现实时通信功能,包括聊天、群组聊天等。以下是将融云集成到Vue.js项目中的详细步骤...

    百度推聊应用.zip项目安卓应用源码下载

    在百度推聊应用中,你将看到如何使用这些组件来构建一个完整的应用,例如,Activity用于用户界面交互,Service处理后台通讯任务,BroadcastReceiver接收系统或自定义广播事件。 2. **网络通信**:即时通讯的核心是...

    ewebeditor v5.5 for ASP 戒聊修改版.rar

    考虑到“戒聊修改版”的特性,开发者在使用时还需要关注安全问题,如防止XSS攻击,以及优化性能,如减少不必要的网络请求,优化图片上传和处理流程,确保编辑器在保持功能的同时,也能高效稳定地运行。 综上所述,...

    QQ热聊怎么用.docx

    以下是关于如何使用QQ热聊的详细步骤和相关知识点: 1. **开启热聊功能**: - 首先,确保您的手机已经安装了最新版本的QQ应用程序,并且已经登录了您的QQ账号。 - 在QQ主界面,通常位于底部的导航栏,找到并点击...

    qq热聊怎么创建.docx

    请注意,虽然系统可能会提示在WiFi环境下使用,但实际在移动数据下也能创建和参与热聊。 4. **创建热聊** 要创建自己的热聊,你需要点击“创建热聊”按钮(如果该功能可见)。按照提示设置热聊的主题、简介,还...

    百度推聊.zip

    《深入剖析Android源码:以“百度推聊”为例》 在移动开发领域,Android操作系统以其开源、自由的特性,吸引了无数开发者投身其中。对于有志于提升Android开发技能的程序员来说,理解并掌握Android源码是至关重要的...

    ewebeditor v5.5 for ASP 戒聊修改版.RAR

    《ewebeditor v5.5 for ASP 戒聊修改版》是一款专为ASP平台设计的网页编辑器,它主要用于在Web应用中提供便捷的富文本编辑功能。此修改版是针对ewebeditor v5.5版本进行了一定的优化和调整,以适应更严格的聊天环境...

    [AndrodeApe.com]百度推聊完整版.zip

    在“pushMessage完整版”这部分源码中,我们可以研究百度云推送是如何工作的。这涉及到Android后台服务的运用,用于监听并处理来自服务器的推送消息。服务组件在后台运行,即使用户退出应用,也能保持与服务器的连接...

Global site tag (gtag.js) - Google Analytics