ruby 中super和super()的区别
我们经常要在子类的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方法传任何参数。
分享到:
相关推荐
super(name, age) @grade = grade end def study puts "#{@name} is studying hard in grade #{@grade}." end end ``` #### 五、进阶技术 1. **模块与混合(Mix-in):** 模块可以用来组织代码或者提供...
`super`关键字用于调用父类的方法。Ruby还支持模块(Module),用于实现命名空间、封装和混合(mixin)功能。 Ruby的异常处理机制允许程序员捕获和处理运行时错误。`begin..rescue..end`结构用于定义异常处理块,`...
它可以用来检测变量、方法、`super`调用或`yield`是否存在。例如,`defined? foo`会返回"local-variable"如果foo已被初始化,否则返回`nil`。 最后,双冒号`::`运算符允许我们直接调用模块或类的方法,或者引用模块...
2.2.4版本通过引入`super`关键字的新行为来解决这个问题,使得调用父类方法变得更加明确和可控。 在性能方面,Ruby 2.2.4增强了YARV(Yet Another Ruby VM)虚拟机,提升了代码执行速度。同时,它还修复了一些已知...
- 方法重写与super:子类可以覆盖父类的方法,使用`super`调用父类方法。 3. **元编程** - 动态特性:Ruby允许在运行时修改类和对象,比如动态添加方法、修改属性等。 - eval:执行字符串中的Ruby代码,常用于...
Ruby中的类还可以继承,通过`操作符定义子类,并可以使用`super`关键字调用父类的方法。 三、控制结构 Ruby提供了多种控制结构,如条件语句(if/else, case)、循环(for, while, until, each)和流程控制语句...
- **super**:调用父类的方法。 - **then**:条件语句中的关键字。 - **true/false**:布尔值。 - **undef**:取消方法的定义。 - **unless/end**:逆向条件语句。 - **until/do/end**:循环直到条件满足。 - **when...
例如`self`表示当前对象引用,`super`用于调用父类中的方法。 **3. Global Constants(全局常量)** - 全局常量以`$`开头,一旦定义后不能更改。 **4. Ranges(范围)** - 表示一个数值区间,可以使用`..`或`......
- `super`关键字用于调用父类的方法。 - `attr_accessor`, `attr_reader`, `attr_writer`用于快速生成getter和setter方法。 4. **块和 Proc/Lambda** - 块是Ruby中的一段可执行代码,可以用do..end或{}定义,...
### Ruby编程语言的核心知识点 #### 一、Ruby的起源与设计理念 **Ruby**是由日本人松本行弘(Yukihiro Matsumoto)于1990年代末期开发的一种编程语言。松本行弘在设计Ruby时融合了多种语言的优点,如**Perl**的...
super('Yukihiro Matsumoto') end end ``` 这里定义了一个`Matz`类,它继承自`Person`类,并覆盖了初始化方法,指定了默认的名字为`Yukihiro Matsumoto`。 ### 控制结构 #### 多分支条件语句 Ruby提供了标准的...
super(name, age) @grade = grade end def study puts "Studying hard in grade #{@grade}." end end ``` **3.4 特殊方法与特殊类** Ruby有一些特殊的类和方法,如`Object`类是所有类的基类,`Kernel`类...
super(640, 480, false) self.caption = "My Game" end def update # 更新游戏逻辑 end def draw # 绘制游戏界面 end end window = GameWindow.new window.show ``` #### 十一、桌面应用程序 Ruby还...
super(x, y) puts "Vehicle moved to (#{@x}, #{@y})" end end v = Vehicle.new(1, 1) v.move(2, 2) ``` #### 总结 模块是 Ruby 语言中组织代码和避免命名冲突的重要工具。通过`require`和`include`语句,可以...
super + 1 end end ``` `WithMilk`装饰了`Coffee`,增加了成本。 4. **代理模式(Proxy)** 代理模式为其他对象提供一种代理以控制对这个对象的访问。在Ruby中,可以使用`Forwardable`模块或者自定义方法实现...
超市API supermarket_api 是一个 Ruby gem,可以轻松与进行通信。安装将此行添加到应用程序的 Gemfile 中: gem 'supermarket_api' 然后执行: $ bundle或者自己安装: $ gem install supermarket_api用法在您的项目...
- **Pseudovariables:** Pseudovariables, like `self`, `super`, and `__FILE__`, are special variables with specific behaviors and usages. The book covers their definitions and common uses. - **Global ...
类可以继承其他类,使用`super`调用父类方法,以及实现多重继承和模块混合(Mix-in)。 5. **模块**:模块用于代码复用和分类,可以通过`include`或`prepend`引入到类中,提供命名空间隔离和防止命名冲突。 6. **...
super end end def initialize(attributes) @attributes = attributes end end dynamic = DynamicMethods.new({ name: "John Doe" }) puts dynamic.get_name # 输出: Fetching name John Doe ``` ## 元编程的...
super('Yukihiro Matsumoto') end end puts Matz.new.greet # 输出 "Hello, my name is Yukihiro Matsumoto." ``` ### 5. 控制结构 Ruby提供了常见的控制结构,如条件语句和循环语句。但是,Ruby的设计原则之一...