ruby中 executable 函数什么含义

Python011

ruby中 executable 函数什么含义,第1张

Ruby中的block(lambda/proc),就是匿名函数,取自于函数式语言lisp,而这个匿名函数在Ruby中是一等公民。

实际上Ruby中每个方法在执行的时候,不管你有没有传递匿名函数,在Ruby内部,都会自动检测有没有传递块,实际上,这个块,也就是匿名函数,就是Ruby中方法的隐形参数。

1.Argument Processing

Ruby 使用了 Symbols 和 Hash 来达到虚拟关键字参数(Pseudo-Keyword Arguments)。这种技巧被广泛应用在 Ruby 的函式库和 Rails 中,增加了阅读性,也很容易使用。

def blah(options)

puts options[:foo]

puts options[:bar]

end

blah(:foo =>"test", :bar =>"test")

Ruby 也可以将参数列当成阵列使用:

def sum(*args)

puts args[0]

puts args[1]

puts args[2]

puts args[3]

end

sum(1,2,3)

如此就可以设计出不固定参数列、十分弹性的 API。类似於 C++ 的 function overloading。在 Rails 中也十分常见这样的 API 设计,例如 link_to 就支援了两种用法:

# USAGE-1 without block

<% link_to 'Posts list', posts_path, :class =>'posts' %>

# USAGE-2 with block

<% link_to posts_path, :class =>'posts' do %>

Posts list

<% end %>

搭配虚拟关键字参数使用的话,可以参考 ActiveSupport#extract_options! 这个小技巧取出 Hash 值。

2. Code Blocks

程式区块(Block)是 Ruby 最重要的特色,除了拿来做迭代(Iteration)之外,也可以包装前後置处理(pre- and Post-processing),一个最基本的例子就是开档了,一般程序式的写法如下:

f = File.open("myfile.txt", 'w')

f.write("Lorem ipsum dolor sit amet")

f.write("Lorem ipsum dolor sit amet")

f.close

使用 Block 之後,我们可以将 f.close 包装起来,不需要明确呼叫。只要程式区块结束,Ruby 就会自动关档。程式一来因为缩排变得有结构,二来也确定档案一定会关闭(不然就语法错误了)

# using block

File.open("myfile.txt", 'w') do |f|

f.write("Lorem ipsum dolor sit amet")

f.write("Lorem ipsum dolor sit amet")

end

另一个程式区块的技法,是用来当做回呼(Dynamic Callbacks)。在 Ruby 中,程式区块也是物件,於是我们可以将程式区块如透过”注册”的方式先储存下来,之後再依照需求找出来执行。例如在 Sinatra 程式中:

get '/posts' do

#.. show something ..

end

post '/posts' do

#.. create something ..

end

我们”注册”了两个回呼:一是当浏览器送出 GET ‘/posts’ 时,会执行 show something 的程式区块,二是 POST ‘/posts’ 时。

3. Module

模组(Module)是 Ruby 用来解决多重继承问题的设计。其中有一招 Dual interface 值得一提:

module Logger

extend self

def log(message)

$stdout.puts "#{message} at #{Time.now}"

end

end

Logger.log("test") # as Logger’s class method

class MyClass

include Logger

end

MyClass.new.log("test") # as MyClass’s instance method

Ruby 的 extend 作用是将模组混入(mix-in)进单件类别(singleton class),於是 log 这个方法除了可以像一般的模组被混入 MyClass 中使用,也可以直接用 Logger.log 呼叫。

要将 Ruby 模组的混入成类别方法(class method),也有一些常见的 pattern 模式,可以将模组设计可以同时混入实例方法(instance method)和类别方法,请参阅投影片范例。这在撰写 Rails plugin 时非常常用。

4. method_missing?

Ruby 的 Missing 方法是当你呼叫一个不存在的方法时,Ruby 仍然有办法处理。它会改呼叫 method_missing 这个方法,并把这个不存在的方法名称传进去当做参数。这个技巧在 Rails 的 ActiveRecord 中拿来使用:

class Person <ActiveRecord::Base

end

p1 = Person.find_by_name("ihower")

p2 = Person.find_by_name_and_email("ihower", "[email protected]")

其中 find_by_name 和 find_by_email 就是这样的方法。不过这个技巧不是万能丹,它的执行效率并不好,所以只适合用在你没办法预先知道方法名称的情况下。不过也不是没有补救之道,如果同样的方法还会继续呼叫到,你可以在 method_missing 之中用 define_method 或 class_eval 动态定义此方法,那麼下次呼叫就不会进来 method_missing,进而获得效能的改善。事实上,ActiveRecord::Base 的 method_missing 就是这麼做的。(感谢 BigCat 留言提醒我有此补救之道)

另一个 Missing 方法的绝妙 API 设计,是拿来构建 XML 文件:

builder = Builder::XmlMarkup.new(:target=>STDOUT, :indent=>2)

builder.person do |b|

b.name("Jim")

b.phone("555-1234")

b.address("Taipei, Taiwan")

end

# <person>

# <name>Jim</name>

# <phone>555-1234</phone>

# <address>Taipei, Taiwan</address>

# </person>

搭配了区块功能,就能用 Ruby 语法来写 XML,非常厉害。

5. const_missing

除了 method_missing,Ruby 也有 const_missing。顾名思义就是找不到此常数时,会呼叫一个叫做 const_missing 的方法。现实中的例子有 Rails 的 ActiveSupport::Dependencies,它帮助我们不需要先载入所有类别档案,而是当 Rails 碰到一个还不认识的常数时,它会自动根据惯例,找到该档案载入。

我们也可以利用这个技巧,针对特定的常数规则来处理。例如以下的程式会自动将 U 开头的常数,自动转译成 Unicode 码:

class Module

original_c_m = instance_method(:const_missing)

define_method(:const_missing) do |name|

if name.to_s =~ /^U([0-9a-fA-F]{4})$/

[$1.to_i(16)].pack("U*")

else

original_c_m.bind(self).call(name)

end

end

end

puts U0123 # ģ

puts U9999 # 香

6. Methods chaining

方法串接是一个很常见的 API 设计,透过将方法的回传值设成 self,我们就可以串接起来。例如:

[1,1,2,3,3,4,5].uniq!.reject!{ |i| i%2 == 0 }.reverse

# 5,3,1

7. Core extension

Ruby 的类别是开放的,可以随时打开它新增一点程式或是修改。即使是核心类别如 Fixnum 或是 Object(这是所有类别的父类别) 都一样。例如 Rails 就定义了一些时间方法在 Fixnum 里:

class Fixnum

def hours

self * 3600 # 一小时有多少秒

end

alias hour hours

end

Time.now + 14.hours

Ruby 的物件模型与元编程(Meta-programming)

在 Ruby 中,所有东西都是物件。甚至包括类别(class)本身也是物件。这个类别物件(class object)是一个叫做 Class 的类别所实例出来的物件。而所有的物件(当然也包括类别物件),都有一个 metaclass (又叫做 singleton, eigenclass, ghost class, virtual class 等名字)。定义在 metaclass 里的方法,只有该物件能够使用,也就是 singleton method (单件方法),只有该物件才有的方法。

了解什麼是 metaclass 是 Ruby 元编程的一个重要前提知识。Ruby 元编程最常用的用途,就是因应需求可以动态地定义方法,例如在 Rails ActiveRecord 中常见的 Class Macro 应用。

要能随心所欲动态定义方法的关键重点,就是 variable scope (变数的作用域) 了。例如以下我们透过 class_eval 和 define_method 帮 String 定义了一个 say 方法,注意到整个 variable scope 都是通透的,没有建立新的 scope:

name = "say"

var = "it’s awesome"

String.class_eval do

define_method(name) do

puts var

end

end

"ihower".say # it’s awesome

class_eval 可以让我们改变 method definition 区域(又叫做 current class)。除了本投影片,建议可以阅读 Metaprogramming in Ruby: It’s Allhe Self 和 Three implicit contexts in Ruby 这两篇文章深入了解 self 和 current class。

8. Class Macro (Ruby’s declarative style)

Class Macro 是 Ruby Meta-programming 非常重要的一个应用,例如在 Rails ActiveRecord 中:

class User <ActiveRecord::Base

validates_presence_of :login

validates_length_of :login,:within =>3..40

validates_presence_of :email

belongs_to :group

has_many :posts

end

FB为Function Blocks(函数块),包含程序代码编写区域和块接口区域。

块接口可以用来定义传递参数的输入、输出参数,各参数的意义如下:

(1)Input:读取外部实参数值至FB;

(2)Output:输出内部运算结果至外部实参;

(3)InOut:既可以读取外部实参数值至FB,也可以输出内部运算结果至外部实参,与输入实参为同一地址;

(4)Static:保存运行过程值;

(5)Temp:FB内部使用的临时变量,访问速度较快;

(6)Constant:FB内部使用的常数。

FB 需要与背景数据块(DB)一同使用,该数据块可以用来传递参数,保存函数块执行的数据,这些数据可以供其他程序使用。

背景数据块

添加背景数据块后,右键点击属性,打开“常规-属性”选项,用户可以取消选中优化块的访问,取消后,用户可以通过绝对地址和符号来访问背景数据块;如果选中,则在DB块中定义变量时,会优化存储这些变量,即使他们的数据类型不同,也不会出现空隙,避免地址空间浪费。

打开CSDN APP,看更多技术内容

三菱FX3U模拟量FB函数块,使用结构化工程编写,FB块全部用ST语言编写...

全部FB块如下: 第一,FX2N-2DA模拟量输出FB函数块, 第二,FX2N-2AD模拟量输入FB函数块, 第三,FX3U-4DA模拟量输出Fb函数块, 第四,FX3U-4AD模拟量输入FB函数块, 第五,通用(所有PLC算法一样)数字量与工程量算法FB函数块! 已上FB...

继续访问

西门子1200PLC中OB,FC,FB,DB_山上的小酒馆的博客_西门子1200...

函数块(FB)属于编程者自己编程的块。函数块是一种“带内存”的块。分配数据块作为其内存(背景数据块)。传送到 FB 的参数和静态变量保存在实例 DB 中。临时变量则保存在本地数据堆栈中。执行完FB 时,不会丢失DB 中保存的数据。但...

继续访问

最新发布 PLC FC 、FB、子程序、函数学习笔记

FC、 FB、 子程序,(甚至包括一些指令)这些称呼其实并没有本质区别,可以统称为函数,比如2元运算符ADD指令等,关于函数的基础知识,可以参看高级语言的函数章节,函数可以被定义为返回任何类型的值,和形式参数不同,返回类型不存在重写,函数的返回值是由将导致函数终止的return语句中的表达式所指定的,函数的返回值并不是左值,(返回的是指),因此函数调用无法出现在外层调用表达式中赋值符号的左边。 1、函数的概念 2、函数参数传递的方向性 3、200 ........

继续访问

14.9-FB(函数块)和FC(函数)的区别及应用场景

信捷函数功能块怎么写_给大家分享我自己用来写动作流程的FB功能块

功能块局部变量 主程序中调用 我一般先将所有动作流程一次性录入到主程序中,每个功能块都改成与流程图一样的名字,不输入任何条件,直接编译保存。检查流程没有错误,然后再开始增加条件,这样就不会乱。

继续访问

三菱PLC FB库函数调用方法 (Gx Work2版本)_quechao990016的博客-CSDN...

三菱PLC FB库函数调用方法 (Gx Work2版本) 本文以 GxWorks2 软件为例 1、新建使用标签项目的工程文件 2、从其它库所在工程项目中导入库 3、选择库文件及FB功能块 4、插入FB功能块调用

继续访问

FANUC FUNCTION BLOCK 功能编写

FANUC FUNCTION BLOCK 功能编写思路!

iOS学习笔记-----block function简单使用

离上次写笔记过去半年了,哎!没坚持几天啊。。。。这几个月里由于有两个项目在做,因此就一直无暇顾忌博客的事情。不过最近我发现我光这样埋头写代码、做项目也并不好,知识是需要积累的,每天埋头敲打码而不思考只会做一些重复的工作是得不到进步的!!!当然啦,我再做这两个项目也做了很多重复的工作。。但是嘞同时也学到了好多新的东西,现在趁有那么一点点空闲时间,我还是

继续访问

Siemens S7-1200 学习笔记 程序块_Ryan Kuo的博客_西门子1200...

2.函数块(FB) 函数块是用户编写的包含经常使用的功能的子程序,其含有专用的背景数据块。 由于运行过程中需要调用各种参数,因此产生了背景数据块DB,所以需要用到的数据就存储在了DB中。即使结束调用,数据也不丢失。

继续访问

三菱fx5u modbus tcp fb块用法_一文教会你,如何掌握三菱FX5U PLC基础知识

现在市面上三菱FX5U PLC因自身的性能特点,使用的人群越来越广!01首先FX5U PLC支持结构化程序,并可写入ST语言和FB语言,以及支持多个程序的执行。02其次,在FX系列中,FX5UPLC的指令运算速度是最快的(LD/MOV指令:34ns),虽然FX5U PLC的程序容量和FX3U PLC是一样的,都是64K,但5U还可以扩展SD卡,完全不用担心存储空间不够用。03此外,FX5U PLC...

继续访问

创建FB-定义接口(基础版)

首先建议大家在编程之前思考好框架,涉及以后的扩展,引用;基础的FB(底层),应该充分降低耦合度(功能要单一),充分总结一下与本功能相关的组件,抽取其中的共同点,认真设计接口参数; 以下以分度盘为例,仅供参考 构建好设计机构后开始编程 1.打开博图软件,新建一个项目: 2.添加自己项目中要用的PLC硬件: 3.根据接口,创建自己的UDT,以便将来外部调用时使用: 3.1先定义输入信号,并初始化初值: 3.2再定义输出信号: 3.3最后合并为分度盘的...

继续访问

博图 FB块中InOut接口的介绍

博图 FB块中InOut接口的介绍

继续访问

博图中fb与多重背景数据块_多重背景数据块的使用

“在同一个系统中,同一类型设备的多次调用,使用多重背景数据块会比较方便”多重数据块是数据块的一种特殊形式,如在OB1中调用FB1,在FB1中又调用FB11和FB12,则只要FB1的背景数据块选择为多重背景数据块就可以了,FB11和FB12不需要建立背景数据块,其接口参数都保存在FB1的多重背景数据块中。01—举例说明例如,PLC控制两台电机,且控制两台电机的接口参数均相同。一般的做法,...

继续访问

TIA Portal 读回FB的输出变量

之前一直使用TIA V14(再早还有V13),新版本发布后也更新过,今年更新了V16版,发现了一个情况,在之前版本中,FB函数块中定义的输出类型变量是不能够在函数中读取使用的。 比如我们在参数接口处定义了两个参数 Output_1: Int类型的Output接口参数; Static_1:Static静态 Int类型的参数; 在V14中,如下图 上面这样每次编译的时候都会有报警,为了避免这种情况我...

继续访问

热门推荐 【算法】复变函数

复变函数复数与复变函数复数复变函数导数积分级数留数保形映射解析函数对平面向量场的应用 复数与复变函数 复数 复数的代数运算: 复数四则运算的几何意义: ①两个复数乘积的模等于它们模的乘 积两个复数乘积的幅角等于它们幅角的和 ②两个复数商的模等于它们模的商两个复数商的幅角等于被 除数与除数的幅角差 ③复数的加减: 复数的幂乘和方根 ①幂乘 ②方根(这里 w≠0 , n≥2 )的复数 ...

继续访问

block的函数式编程和链式编程

一 block的函数式编程和链式编程定义及实例1.定义函数式编程:它属于”结构化编程”的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用。代表:ReactiveCocoa。链式编程:是将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,使代码可读性好。a(1).b(2).c(3)2.Masonry框架内包含有丰富的函数式编程和链式编程思想 示例:- (void)masonryDmeo

继续访问

三菱PLC编程软件GX WORKS3中如何使用FB函数块?

三菱PLC编程软件GX WORKS3中如何使用FB函数块? 首先,我们新建一个工程项目,如下图所示,我们双击“程序本体”进入程序编辑界面; 2. 我们找到右侧的部件选择窗口(这里以定时器FB举例说明),将TIMER_10_FB_M鼠标左键按住后直接拖拽到左侧程序编辑窗口中 3.简单介绍一下TIMER_10_FB_M的用法,如下图所示: 4.分别将FB块的各个管脚,连接我们所需的变量(变量是位地址的,连接触点和线圈;变量是寄存器或者是具体数值的,需要点击应用指令图标然后手动输入自己的数据),如下图

继续访问

fb静态区域_西门子 PLC FC和FB用法讲解

原标题:西门子 PLC FC和FB用法讲解本是专门为1200 PLC讲解开辟的专题,想来应该适合所有TIA PORAL支持的PLC,所以把1200从标题中去掉。很多新手都会问,FC和FB到底什么区别呢?该怎么使用呢?其实很简单啦,仔细阅读下面内容就能理解哦!FC块讲解首先,我们从两者的名字就可以进行区分,可以用一个公式即FB=FC+DB来表示,FB是具有DB背景块的特殊FC,也就是说FB具有FC的...

继续访问

1200-FB块和 FC块

FB和FC区别 FB–功能块,带背景数据块 FC–功能,相当于函数 FB,FC块均相当于子程序,既可以调用其它FB,FC块,也可以被OB,FB,FC块调用。 他们之间的主要区别是: FB使用背景数据块作为存储区,FC没有独立的存储区,使用全局DB或M区 FB局部变量有STAT和TEMP,FC由于没有自己的存储区因此不具有STAT,TEMP本身不能设置初始值。 本质上,FB,FC的实现目的是相同的;无论何种逻辑要求,FB,FC均可实现。只是实现方式效率不同,这也和工程师个人编程习惯有关。 FB块优点:

继续访问

PLC编程中FB和FC块的区别

学习plc时特别难理解FB和FC的区别和用法。接下来,我们来谈谈它们的区别和用法。 带背景数据块的功能块 FC - function,相当于函数FB,FC块相当于子程序,可以被其他FB、FC块或者OB、FB、FC块调用。 主要区别是: FB使用后台数据块作为存储区域,FC没有独立的存储区域,使用全局DB或M区域的FB局部变量有STAT和TEMP,FC没有STAT是因为没有自己的存储区域,TEMP本身无法设置初始值。本质上,FB和FC达到了同样的目的;无论什么逻辑要求,FB和FC都

继续访问

Function and Block

js: [code="js"]var block = function(arg){ alert(arg) }var func = function(arr,blck){ for (var i in arr){ blck(arr[i])} }func([1,2,3],block)[/code] ruby: [code="ruby"] class ...

继续访问

博图中fb与多重背景数据块_PLC初学者不知道什么是FC、FB、OB、DB块,一定要明白...

最近经常有初学西门子PLC编程的朋友,对于FC、FB、OB、DB块特别迷茫,一开始的时候可能很多人都会遇到类似的问题一. 组织块,组织块是操作系统和用户程序之间的接口。OB 用于执行具体的程序,我们最常用的就是OB1,所有的FB和FC块都需要直接或者间接的接受调用,才能执行,如下图是创建组织块,每个不同组织块是不同的功能1、在 CPU 启动时;2、在一个循环或延时时间到达时;3、当发生硬件中断时;...

继续访问

西门子PLC中FB块与FC块的区别

1.首先创建了2个块,一个FB块,还有一个FC块。 2.FB块创建完以后,当在MAIN主程序中调用时,会让你添加一个 DB块,而在DB块当中,默认的是保持数据 。但是在FC调用时却不会出现DB块的调用。 3.FB与FC块的接口调用区别 4.在main主程序中,当fb块使用后,数据都是保存着的,但是fc块调用结束后,数据清零,如图示 ...

继续访问

OB、FC、FB、SFC、SFB的区别

S7-300/400PLC程序采用结构化程序,把程序分成多个模块,各模块完成相应的功能。结合起来就能实现一个复杂的控制系统。就像高级语言一样,用子程序实现特定的功能,再通过主程序调用各子程序,从而能实现复杂的程序。 在S7-300/400PLC中写在OB1模块里和程序就是主程序,子程序写在功能(FC),功能块(FB)。 FC运行是产生临时变量执行结束后数据就丢失--------------不具

继续访问

fb(函数块)