ruby中语法知识

return home


参考链接

  • 理解Ruby中的作用域
  • Ruby 中的类与对象
  • Ruby学习之元编程  Kernel#evel(), Object#instance_evel()、Module#class_evel()

知识点

  • ruby中include和extend以及模块中ClassMethods

  • Ruby require,load,include,extend的显著区别

  • Ruby中的 Object、Class、Module之间关系  Class与Module的区别


  • method查看方法是哪个类定义的 methods查看对象有哪些方法
  • source_locationc查看方法定义处
method = method('_run_validate_callbacks')
p method
p method.source_location
#<Method: ManageIQ::Providers::Aliyun::CloudManager::Vm(ActiveRecord::Base)#_run_validate_callbacks>
# ["/home/yulilong/.rvm/gems/ruby-2.3.0/gems/activesupport-5.0.0.1/lib/active_support/callbacks.rb", 749
  • 检查一个变量是否已经定义
    可以用defined?,如果未定义会返回字符串"nil",否则返回该变量的定义类型。如下面的例子:
irb(main):007:0> a = 1
=> 1
irb(main):008:0> defined? a
=> "local-variable"
irb(main):009:0> defined? b
=> nil
irb(main):010:0> defined? nil
=> "nil"
irb(main):011:0> defined? String
=> "constant"
irb(main):012:0> defined? 1
=> "expression"
  • p caller 可以查看是谁调用了你

  • ruby的class << self, 及其class_eval和instance_eval的区别
    http://blog.csdn.net/lyx2007825/article/details/10089115

class Array  class << self  def hint  "hello"  end  end  
end  
Array.hint
这段代码是添加类方法,只能类去调用这个方法
  • 对象中存在实例变量 (instance variables) ,可以通过方法 instance_variables 进行查看当前对象中的 实例变量
class MyClassdef my_method@v = 1end
end
obj = MyClass.new
obj.class   # => MyClass
obj.instance_variables  # => []
obj.my_method
obj.instance_variables  # => [:@v]
  • .class的使用
    因为类也是一种对象,因此所有对象的特性也是类具有的特性。比如,(Class) 有自己的类,这个类就是——Class,举个例子,假如一个字符串可以通过 str#class 获得它的类 String ,那么 String 作为一个对象也可以通过 String#class 获知它自己的类。比如下面的代码:
"hello".class   # => String
String.class    # => Class
Class.class     # => Class

类方法的定义

class HelloWorlddef greetend
end# 1.在class <<类名 ~end 这个特殊的类定义中,以定义实例方法的形式来定义类方法
class << HelloMethoddef SayHello(name)puts "#{name} say hello"end
end
HelloMethod.SayHello("Bob")#2.在class上下文中使用self时,引用的对象是该类本身,因此可以使用class << self ~ end来定义
class ClassMethodclass << selfdef Hello(name)puts "#{name} say hello!"endend
end
ClassMethod.Hello("Bob")#3.使用def 类名.方法名 ~end 这样的形式来定义类方法
class ClassMethoddef ClassMethod.SayHello(name)puts "#{name} say hello"end
end
ClassMethod.SayHello("Ruby")#4.同样类似第二种方法一样使用self
class ClassMethoddef self.SayHello(name)puts "#{name} say hello"end
end
ClassMethod.SayHello("Bob")# 参考链接:https://www.jianshu.com/p/ae6e78602586
  • ruby 中super和super()的区别
    http://blog.csdn.net/autumn20080101/article/details/8146310
我们经常要在子类的initialize方法中调用super和super()。
从语法上说super和super()是有微妙区别的。
super不带括号表示调用父类的同名函数,并将本函数的所有参数传入父类的同名函数;
super()带括号则表示调用父类的同名函数,但是不传入任何参数;
class SParent  def initialize *args  args.each {|arg| puts arg}  end  
end  class SChild < SParent  def initialize a, b, c  super  end  
end  a, b, c = *%W[a b c]  
SChild.new a, b, c # puts a, b, c if super  
SChild.new a, b, c # puts nothing if super() 
可以看出当SChild的initialize中调用super()时,代码是不会打印任何信息的。这是因为super()没有向SParent的initialize方法传任何参数。
  • ruby 类方法中 self.class.方法名
    子类中方法调用父类中同名的 类方法
class AAdef self.tep 'I an AA'end
end
class BB < AAdef teself.class.teend
end
a = BB.new
a.te
# "I an AA"
  • 完美理解ruby中的yield的概念
 看到axgle 兄解释ruby中的yield的概念,形象的理解为“占位”的作用。  但是对yield还可以带着参数的概念总觉得有点不够形象,  def foo  yield [1,2,3]  end  foo {|v| p v}  以我看来更像是,比喻成一个纯虚函数更好理解,其中,在方法后跟块后,不过就是对yield的声明化了而已。  不过对于初步理解yield还是有很好帮助,算是完美解释了。  
大学里常常发生占位置的现象:头天晚上拿一本书放在课座上,表示位置已经被占了;第二天才来到这个座位上,翻开书正式上课.在这个现象中,“书本”充当了“占位符”的作用。  
在Ruby语言中,yield是占位符:先在前面的某部分代码中用yield把位置占着,然后才在后面的某个代码块(block)里真正实现它,从而完成对号入座的过程.   
定义find    
def find(dir)    Dir.entries(dir).each {|f| yield f} #获得dir目录下的文件名列表;对每个文件名,用yield来处理(至于怎么处理,还不知道,占个位置先^_^)    
end    使用find    
find(".") do |f| #block开始    puts f  #用输出文件名这个语句,真正实现了yield的处理(也可以用任何其他语句)    
end #block结束    由此可见,yield属于定义层,属于宣告层,也就是在心里说一句:"这个位置不错,我先用书本占了再说!";
而block属于使用层,实现层,也就是最终你坐在了你先前占的位置上,从而真正的实现了对号入座的过程.   
  • empty、nil、blank三者之间的区别

http://www.cnblogs.com/lmei/p/3262816.html

这三个方法在ROR中经常用到,都是用来判断是否为空的。    区别是:     ruby的方法:.nil?、.empty?    rails的方法 :.blank?    用法的区别:    .nil?    :   判断对象是否存在。      
.empty? :   是对象已经存在,判断是否为空字段。    
.blank?  :   相当于同时满足 .nil? 和 .empty? 。     
注: Rails API中的解释是如果对象是:false, empty, 空白字符都是blank。     
比如说: "", " ", nil, [], 和{}都算是blank。   
也就是说,object.blank? 相当于 object.nil? || object.empty?     
.nil? 和 empty? 的简单例子   true.blank?   #=> false
false.blank?  #=> true
"true".blank? #=> false
"".blank?     #=> true
"\n".blank?   #=> true
'\n'.blank?   #=> false
'true'.blank? #=> false
''.blank?     #=> true
1.blank?      #=> false
[].blank?     #=> true
[1].blank?    #=> false
  • alias设置别名
alias 别名  原名  #直接使用方法名
alias :别名 :原名 #使用符号名
除了为方法设置别名外,在重定义以存在的方法时,为了能用别名调用原来的方法,也需要用alias

ruby中的布尔值

ruby中布尔值是一个特殊对象。它由两个类型组成TrueClass和FalseClass,可以在irb里试一下 true.class,这两个类型生成两个特殊的对象: true 和 false。

所有ruby中的对象都可以转成布尔值,nil是false,其他全部是true,当然false还是false。
在irb里试:puts “true” if nil,则不会打出 true,而是返回nil。

0并不象想象中的那样是false,而是true. 可以在irb里试一下: puts “true” if 0 . 这会打印出true,说明0就是true,因为它是一个对象,ruby没有数字型的说法,而是一个对象。

在使用的时候,如果掌握不了这种灵活的用法,那么就注意几点就行了:
1.使用同类型比较,返回的布尔值肯定是对的。比如: 0==“0” ,这是false。 0==0 就是true。
2.不要直接取对象的布尔值。比如: 0 是true, “0” 也是 true, 而 0!=0 是false,如果判断非0一定要直接写 obj != 0 ,不能象c那样写。即使是判断nil,也用 obj.nil?,这样代码比较清晰。
3.使用if ,弃用unless。如果你有时候会弄晕,那么为了保证安全,只用if ,即使是检查nil也不用unless。
特别是你在多种语言间转来转去的时候。
http://www.th7.cn/Program/c/201609/952039.shtml

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/31966.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二分查找与移除元素有序数组的平方、 长度最小的子数组、螺旋矩阵II

数组 704. 二分查找 704. 二分查找 - 力扣 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 class Solution { public:…

Spring Cloud Hystrix快速入门demo

1.什么是Spring Cloud Hystrix&#xff1f; Spring Cloud Hystrix 是一个用于处理分布式系统中故障的库。它实现了熔断器模式&#xff0c;可以防止由于故障服务的连锁反应而导致整个系统崩溃。Spring Cloud Hystrix 提供了丰富的功能&#xff0c;如熔断、降级、限流、缓存等&a…

Python xlwt库:写excel表格

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

基于java+springboot+vue实现的电商应用系统(文末源码+Lw)241

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本电商应用系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&a…

当flex-direction: column时,设置flex:1不生效解决办法

当需求是: 页面纵向排列,且最后一个元素撑满剩余高度 flex:1在横向排列时是可以的,但是纵向排列会失效,此时需要给最后一个子元素设置align-self: stretch;即可撑满剩余高度 <div class"father"><div class"child child1"></div><div…

Python抓取高考网图片

Python抓取高考网图片 一、项目介绍二、完整代码一、项目介绍 本次采集的目标是高考网(http://www.gaokao.com/gkpic/)的图片,实现图片自动下载。高考网主页如下图: 爬取的流程包括寻找数据接口,发送请求,解析图片链接,向图片链接发送请求获取数据,最后保存数据。 二…

C++设计模式——Composite组合模式

一&#xff0c;组合模式简介 真实世界中&#xff0c;像企业组织、文档、图形软件界面等案例&#xff0c;它们在结构上都是分层次的。将系统分层次的方式使得统一管理和添加不同子模块变得容易&#xff0c;在软件开发中&#xff0c;组合模式的设计思想和它们类似。 组合模式是…

DDP(Differential Dynamic Programming)算法举例

DDP(Differential Dynamic Programming)算法 基本原理 DDP(Differential Dynamic Programming)是一种用于求解非线性最优控制问题的递归算法。它基于动态规划的思想,通过线性化系统的动力学方程和二次近似代价函数,递归地优化控制策略。DDP的核心在于利用局部二次近似来…

(vue3)引入组件标红,...has no default export 组件没有默认导出

(vue3)引入组件标红&#xff0c;…has no default export 组件没有默认导出 一、项目背景&#xff1a; 创建的vitevue3ts项目页面有标红,但程序不报错 二、原因 由于之前安装了 Vetur 插件&#xff0c;Vetur 默认使用 eslint-plugin-vue&#xff0c;并且强制 export default …

linux升级openssh

在日常开发中&#xff0c;经常会需要升级服务器漏洞&#xff0c;记录一下linux升级openssh相关&#xff0c;服务器版本为centos7.8&#xff0c;升级有两种方案&#xff0c;一种是可以上互联网环境&#xff0c;一种是内网环境&#xff0c;我这边因为是内网环境&#xff0c;只能进…

MySQL中CASE WHEN用法总结

MySQL中CASE WHEN用法总结 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在MySQL中&#xff0c;CASE WHEN语句是一种条件表达式&#xff0c;用于在查询中进行…

【AI应用探讨】—多模态应用场景

目录 1. 自动驾驶技术 多模态传感器融合 技术突破 2. 智能家居领域 多模态交互方式 应用实例 3. 智能客服领域 智能问答与情感分析 提升服务效率 4. 跨模态生成与理解 文字生成图像/视频 图像/视频生成文本 5. 未来发展趋势 多模态解析与生成 价值对齐与伦理考虑…

数据结构——优先级队列(堆)Priority Queue详解

1. 优先级队列 队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能带有优先级&#xff0c;一般出队列时&#xff0c;可能需要优先级高的元素先出队列&#xff0c;该场景下&#xff0c;使用队列不合适 在这种情况下&#xff0c;数据结构应…

代理ip服务器有哪些作用?

IP代理服务器具有以下几个作用&#xff1a; 1. 隐藏真实IP地址 代理服务器作为中间人&#xff0c;将用户请求转发给目标网站&#xff0c;从而隐藏用户的真实IP地址。这有助于保护用户的隐私和匿名性&#xff0c;防止被网站或其他人追踪和监控。 2. 绕过访问限制 某些网站可能…

2024.06.21 刷题日记

101. 对称二叉树 判断是否对称&#xff0c;检查 root->left->val root->right->val&#xff0c;接着进行递归检查对称位置&#xff1a; class Solution { public:// 传入对称位置的两个对称位置bool isMirror(TreeNode* left, TreeNode* right) {if (!left &…

设计模式2-面向对象设计原则

设计模式-面向对象的设计原则 依赖倒置原则开闭封闭原则单一职责原则Liskov替换原则接口隔离原则面向对象优先使用对象组合&#xff0c;而不是类继承。封装变化点针对接口编程&#xff0c;而不是针对实现编程 变化是复用的天地。面向对象设计最大的优势在于抵御变化。 重新认识…

odoo 翻译字段sql查询语句

字段写法&#xff1a; name->>en_US 任务&#xff1a; 查询name字段中&#xff0c;包含ring的数据 SQL模糊查询 SELECT * FROM product_public_category WHERE name->>en_US LIKE %ring%; SQL精准查询 SELECT * FROM product_public_category WHERE name->…

深入解析MVC架构(Model-View-Controller Architecture)

目录 前言1. MVC架构概述1.1 模型&#xff08;Model&#xff09;1.1.1 数据管理1.1.2 业务逻辑 1.2 视图&#xff08;View&#xff09;1.2.1 数据展示1.2.2 用户界面设计 1.3 控制器&#xff08;Controller&#xff09;1.3.1 用户输入处理1.3.2 更新模型和视图 2. MVC架构的优缺…

主干网络篇 | YOLOv5/v7 更换主干网络之 ResNet50/ResNet101 | 对比实验必备

主干网络篇 | YOLOv5/v7 更换主干网络之 ResNet50/ResNet101 | 对比实验必备 1. 简介 ResNet 是近年来最受欢迎的深度卷积神经网络架构之一&#xff0c;它以其优异的性能和鲁棒性而著称。ResNet50 和 ResNet101 是 ResNet 家族中最常用的两个模型&#xff0c;它们分别具有 50…

【深度学习】stable-diffusion-webui AUTOMATIC1111 的参数解释翻译

https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Command-Line-Arguments-and-Settings 参数命令值默认值描述-h, --helpNoneFalse显示帮助信息并退出–exit安装后终止–data-dirDATA_DIR./存储所有用户数据的基本路径–configCONFIGconfigs/stable-diffusion/…