浅说ruby嵌套函数


想到这个问题是因为看了网上的一个问题,大家可以先看看:http://pivotallabs.com/users/nick/blog/articles/302-ruby-quiz-a-trick-question
 

我先从第二个问题开始讲起:
 
下面的演示可以在irb中,也可以自己写一个main.rb之类的文件运行尝试(我的ruby是1.9.3)
 
首先,开始看一个最简单的函数,
 

def foo  
    1  
end  



我们知道ruby的顶级作用域是一个名叫main的Object,那么foo是在self为main中定义的,那它是存在于哪里的呢?增加两行代码

puts private_methods.include?(:foo)  #=> true
puts Object.private_methods.include?(:foo)  #=> true
 

说明foo这个函数成为了Object类中的一个private方法。怎么回事呢?
 
这是因为ruby有一个当前类的概念,这里的当前类就是main的类型,即Object,所以,定义foo的时候,就是在Object中定义了一个private方法(附加问题:为什么是private?
 

那回到那个日本人问的问题:
 

def foo  
    def foo  
        1  
    end  
end  


运行下面的代码:

puts private_methods.include?(:foo)  #=> true
puts Object.private_methods.include?(:foo)  #=> true
puts public_methods.include?(:foo)  #=> false
puts Object.public_methods.include?(:foo)  #=> false
puts foo  #=> nil
puts private_methods.include?(:foo)  #=> false
puts Object.private_methods.include?(:foo)  #=> false
puts public_methods.include?(:foo)  #=> true
puts Object.public_methods.include?(:foo)  #=> true
puts foo #=> 1 

 

这个时候应该注意到两个事情,第一个需要注意的是,当第一次调用foo的时候,返回值为nil,当第二次调用nil的时候,返回值为1。第二点需要注意的是,当第一次调用之前是foo属于Object的priavte方法,而当第一次调用结束以后,foo变成了Object的public方法。
 
首先解释第一个问题,当第一次运行foo的时候,foo的功能是定义一个返回值为1的foo方法,而这个新方法将会覆盖原来的方法,所以,第二次调用的时候返回值就是1了。
 
对于第二个问题的解释,不妨再看一个demo:
 

class C  
    def main  
        private_hello  
    end  
private  
    def private_hello  
        def public_hello  
            1  
        end  
    end  
end  
  
c =  C.new  
puts c.private_methods.include?(:private_hello)  #=> true
puts c.public_methods.include?(:public_hello)  #=> false
c.main  
puts c.public_methods.include?(:public_hello)  #=> true

 
从结果可以分析得到,虽然是在private的方法中定义了一个新的方法,但是新的方法与它在哪儿被定义的是没有关系的,这也就解释了为什么在原来private的foo方法中定义了一个新的foo方法,而新方法是public的原因了。
 

好,然后我们来看第二个问题。

def foo  
    def bar  
        1  
    end  
end  
  
puts foo.bar  #=> 1


 
小日本的问题:Is this some magical lightweight object creation syntax so you can do cool method chaining?
 
我只能说,呵呵,这其实不是什么神奇的语法,foo.bar的意思是向self.foo的返回值发送一个名为bar的方法
 
第一次调用foo在定义了bar的同时返回值是NilClass,也就说其实是没有返回值的然后是向nil发送了bar,这是什么意思呢?为什么可以行的通呢?想想前面的那个问题,不难理解,Object中存在了一个public方法,叫做bar再然后,nil是NilClass的一个对象,而NilClass是继承于Object,所以,如果向nil发送bar的时候,其实是会调用到Object的bar方法的

def foo  
    def bar  
        1  
    end  
end  
  
foo  
puts nil.methods.include?(:bar)  #=> true
puts NilClass.ancestors  #=> [NilClass, Object, Kernel, BaseObject]


应该说清楚了吧,好开心

 

转载于:https://www.cnblogs.com/java20130722/archive/2012/10/28/3206863.html

### 先进过程控制(APC)的基本概念 先进过程控制(Advanced Process Control, APC)是一种基于模型的过程控制方法,旨在提高复杂工业系统的性能和效率。它通常用于处理具有强耦合、大滞后或多变量特性的动态系统[^1]。相比于传统的PID控制器,APC能够更好地应对复杂的工艺条件并优化整体操作。 APC的核心目标在于利用预测性和自适应特性来减少波动、改善稳定性和最大化产量的同时降低能耗成本。其基本组成包括但不限于多变量预估控制器(MPC),以及状态估计器等组件[^3]。 ### 工业自动化中的应用实例 #### 1. **石油炼化领域** 在石油化工行业中,APC广泛应用于蒸馏塔的操作优化中。通过实时调整温度、压力等多个参数,可以显著提升产品收率并维持质量标准一致。例如,在催化裂化装置(CCU)里实施MPC策略能有效平衡轻油产出比例与重质残渣处理能力之间的关系。 ```python import numpy as np from scipy.optimize import minimize def apc_optimization(params): # 定义目标函数 (简化版) yield_rate = params[0]*params[1] - params[2]**2 return -yield_rate # 寻找最大值需返回负数形式 initial_guess = [1.0, 1.0, 1.0] result = minimize(apc_optimization, initial_guess) print(f"Optimal parameters: {result.x}") ``` 此代码片段展示了一个简单的模拟案例,其中`apc_optimization`代表某种化学反应过程中影响产物得率的关键因素组合方式之一。 #### 2. **化工生产流程** 对于涉及多个串联或并联单元操作的大型化工厂来说,采用APC可以帮助协调各阶段间的物料流动速率匹配问题,从而避免瓶颈效应的发生。比如聚乙烯聚合反应釜群之间切换时序安排就需要依赖精准的时间序列规划算法支持才能达到最佳经济效益和社会效益双重目的[^3]。 #### 3. **钢铁冶金加工环节** 现代轧钢生产线普遍装备有高度集成化的计算机控制系统,其中包括了针对厚度尺寸精确调控方面的高级功能模块——即所谓的“张力平坦度联合闭环反馈机制”。这种特殊类型的APC方案不仅考虑到了当前时刻的实际测量偏差情况,还会前瞻性地考虑到未来可能产生的趋势变化方向及其幅度大小等因素综合考量之后再做出最终决定如何动作执行机构完成相应修正作业[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值