流程控制语句通过程序设定一个或多个条件语句来实现。在条件为 true 时执行指定程序代码,在条件为 false 时执行其他指定代码。
Julia 提供了大量的流程控制语句:
复合表达式:begin 和 ;。
条件表达式:if-elseif-else 和 ?: (三元运算符)。
短路运算:逻辑运算符 &&(与)和 ||(或),以及链式比较。
循环语句:循环:while 和 for。
异常处理:try-catch、error 和 throw。
Task(协程):yieldto。
begin ... end 表达式可以按顺序计算若干子表达式,并返回最后一个子表达式的值:
因为这些是非常简短的表达式,它们可以简单地被放到一行里,这也是 ; 链的由来:
实际使用过程并不要求 begin 代码块是多行的,或者 ; 链是单行的:
条件表达式可以根据布尔表达式的值来决定执行哪一个代码块。
if-elseif-else 语法:
一个 if 语句后可跟一个可选的 else if...else 语句,这可用于测试多种条件。
当使用 if...else if...else 语句时,以下几点需要注意:
下面是对 if-elseif-else 条件语法的分析:
如果表达式 x < y 是 true,那么对应的代码块会被执行;否则判断条件表达式 x > y,如果它是 true,则执行对应的代码块;如果没有表达式是 true,则执行 else 代码块。
三元运算符 ?: 类似 if-elseif-else 语法:
a ? b : c在 ? 之前的表达式 a, 是一个条件表达式,如果条件 a 是 true,三元运算符计算在 : 之前的表达式 b;如果条件 a 是 false,则执行 : 后面的表达式 c。
注意:? 和 : 旁边的空格是强制的,像 a?b:c 这种表达式不是一个有效的三元表达式(但在? 和 : 之后的换行是允许的)。
如果表达式 x < y 为真,整个三元运算符会执行字符串 "less than",否则执行字符串 "not less than"。
链式嵌套使用三元运算符:
为了方便链式传值,运算符从右到左连接到一起。
与 if-elseif-else 类似,: 之前和之后的表达式只有在条件表达式为 true 或者 false 时才会被相应地执行:
Julia 中的 && 和 || 运算符分别对应于逻辑 "与" 和 "或" 操作。
a && b 中,子表达式 b 仅当 a 为 true 的时候才会被执行,如果 a 为 false 则直接返回 false。a || b 中,子表达式 b 仅在 a 为 false 的时候才会被执行,如果 a 为 true ,直接返回 a。&& 和 || 都依赖于右边,但是 && 比 || 有更高的优先级,查看实例:
循环语句使用 while 和 for 两个关键字来实现。
下面是一个 while 循环的例子:
while 循环语句通过会执行条件表达式( i <= 5),只要它为 true,就一直执行 while 循环的主体部分。如果条件表达式为 false,也就是 i=6 的时候,那么循环就结束了。
for 循环使用起来会更加方便,以上实例使用 for 循环实现如下:
这里的 1:5 是一个范围对象,代表数字 1, 2, 3, 4, 5 的序列。
for 循环在这些值之中迭代,对每一个变量 i 进行赋值。
for 循环与之前 while 循环的一个非常重要区别是作用域,即变量的可见性。如果变量 i 没有在另一个作用域里引入,在 for 循环内,它就只在 for 循环内部可见,在外部和后面均不可见。你需要一个新的交互式会话实例或者一个新的变量名来测试这个特性:
一般来说,for 循环组件可以用于迭代任一个容器。在这种情况下,相比 =,另外的(但完全相同)关键字 in 或者 ∈ 则更常用,因为它使得代码更清晰:
为了方便,我们可能会在测试条件不成立之前终止一个 while 循环,或者在访问到迭代对象的结尾之前停止一个 for 循环,这可以用关键字 break 来完成:
没有关键字 break 的话,上面的 while 循环永远不会自己结束,而 for 循环会迭代到 1000,这些循环都可以使用 break 来提前结束。
在某些场景下,需要直接结束此次迭代,并立刻进入下次迭代,continue 关键字可以用来完成此功能:
这是一个有点做作的例子,因为我们可以通过否定这个条件,把 println 调用放到 if 代码块里来更简洁的实现同样的功能。在实际应用中,在 continue 后面还会有更多的代码要运行,并且调用 continue 的地方可能会有多个。
多个嵌套的 for 循环可以合并到一个外部循环,可以用来创建其迭代对象的笛卡尔积:
有了这个语法,迭代变量依然可以正常使用循环变量来进行索引,例如 for i = 1:n, j = 1:i 是合法的,但是在一个循环里面使用 break 语句则会跳出整个嵌套循环,不仅仅是内层循环。每次内层循环运行的时候,变量(i 和 j)会被赋值为他们当前的迭代变量值。所以对 i 的赋值对于接下来的迭代是不可见的:
如果这个例子给每个变量一个关键字 for 来重写,那么输出会不一样:第二个和第四个变量包含 0。
可以使用 zip 在单个 for 循环中同时迭代多个容器:
使用 zip 将创建一个迭代器,它是一个包含传递给它的容器的子迭代器的元组。 zip 迭代器将按顺序迭代所有子迭代器,在 for 循环的第 ii 次迭代中选择每个子迭代器的第 ii 个元素。 一旦任何子迭代器用完,for 循环就会停止。
for 语句可以嵌套多个循环条件,使用逗号 , 分隔:
格式如下:
我们还可以指定想要生成的元素类型:
有时我们希望遍历数组的每个元素,包含元素的索引号。
Julia 提供了 enumerate(iter) 函数,参数 iter 为可迭代对象,该函数将生成索引号以及每个索引号对应的值。
程序执行过程中,如果发生意外条件,一个函数可能无法向调用者返回一个合理的值。在这种情况下,最好让意外条件终止程序并打印出调试的错误信息,这样可以方便开发者处理它们的代码。
通过 try / catch 语句,可以方便处理异常情况。
例如, 在下面的代码中,平方根函数 sqrt 会引发异常。 通过 try / catch 我们可以准确输出异常信息。
在进行状态改变或者使用类似文件的资源的编程时,经常需要在代码结束的时候进行必要的清理工作(比如关闭文件)。由于异常会使得部分代码块在正常结束之前退出,所以可能会让上述工作变得复杂。finally 关键字提供了一种方式,无论代码块是如何退出的,都能够让代码块在退出时运行某段代码。
这里是一个确保一个打开的文件被关闭的例子:
当控制流离开 try 代码块(例如,遇到 return,或者正常结束),close(f) 就会被执行。如果 try 代码块由于异常退出,这个异常会继续传递。catch 代码块可以和 try 还有 finally 配合使用。这时 finally 代码块会在 catch 处理错误之后才运行。
我们可以用 throw 显式地创建异常。
例如,若一个函数只对非负数有定义,当输入参数是负数的时候,可以用 throw 抛出一个 DomainError。
注意 DomainError 后面不接括号的话不是一个异常,而是一个异常类型。我们需要调用它来获得一个 Exception 对象:
另外,一些异常类型会接受一个或多个参数来进行错误报告:
我们可以仿照 UndefVarError 的写法,用自定义异常类型来轻松实现这个机制:
Task(协程)提供了非局部的流程控制,这使得在暂时挂起的计算任务之间进行切换成为可能。在后面的异步编程章节我们会想象介绍。
当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少
我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.
我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新rubygems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
在我的Character模型中,我添加了:字符.rbbefore_savedoself.profile_picture_url=asset_path('icon.png')end但是,对于数据库中已存在的所有角色,它们的profile_picture_url为nil。因此,我想进入控制台并遍历所有这些并进行设置。在我试过的控制台中:Character.find_eachdo|c|c.profile_picture_url=asset_path('icon.png')end但这给出了错误:NoMethodError:undefinedmethod`asset_path'formain:O
当我进入Rails控制台时,我已将pry设置为加载代替irb。我找不到该页面或不记得如何将其恢复为默认行为,因为它似乎干扰了我的Rubymine调试器。有什么建议吗? 最佳答案 我刚发现问题,pry-railsgem。忘记了它的目的是让“railsconsole”打开pry。 关于ruby-on-rails-带有Pry的Rails控制台,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/question
我正在尝试将$stdout设置为临时写入一个文件,然后返回到一个文件。test.rb:old_stdout=$stdout$stdout.reopen("mytestfile.out",'w+')puts"thisgoesinmytestfile"$stdout=old_stdoutputs"thisshouldbeontheconsole"$stdout.reopen("mytestfile1.out",'w+')puts"thisgoesinmytestfile1:"$stdout=old_stdoutputs"thisshouldbebackontheconsole"这是输出。r
我在思考流量控制的最佳实践。我应该走哪条路?1)不要检查任何东西并让程序失败(更清晰的代码,自然的错误消息):defself.fetch(feed_id)feed=Feed.find(feed_id)feed.fetchend2)通过返回nil静默失败(但是,“CleanCode”说,你永远不应该返回null):defself.fetch(feed_id)returnunlessfeed_idfeed=Feed.find(feed_id)returnunlessfeedfeed.fetchend3)抛出异常(因为不按id查找feed是异常的):defself.fetch(feed_id
我真的只是不确定这意味着什么或我应该做什么才能让网页在我的本地主机上运行。现在它只是显示一个错误,上面写着“我们很抱歉,但出了点问题。”当我运行railsserver并在chrome中打开localhost:3000时。这是控制台输出:StartedGET"/users/sign_in"for127.0.0.1at2013-07-0512:07:07-0400ProcessingbyDevise::SessionsController#newasHTMLCompleted500InternalServerErrorin55msNoMethodError(undefinedmethod`
在Rails控制台中执行类似yGrau.all的命令时,我得到这些奇怪的!binary字符串而不是属性名称。知道如何解决这个问题吗?谢谢。irb(main):003:0>yGrau.all←[1m←[36mGrauLoad(0.0ms)←[0m←[1mSELECT"graus".*FROM"gr←[1m←[35mEXPLAIN(0.0ms)←[0mEXPLAINQUERYPLANSELECT"grauEXPLAINfor:SELECT"graus".*FROM"graus"0|0|0|SCANTABLEgraus(~1000000rows)----!ruby/object:Grauat