ruby中self,效果域,可见性的用法详解
有些事情永远和永远都是不变的,例如,就像整数一样,您无法使用class陈述式做为变数名称一次,因此当您看到它们时,会做些什么
self表示当前或默认的对象,它在程序每次运行时都代表一个特定对象,但这意味着它可能会发生变化
框架(scope)规则决定了变量的可见性,您必须知道哪些域受影响,哪些变量代表什么,并与其它域中的变量相混合
您可以了解目前的涵盖范围,以及self代表谁,并快速分析您所遇到的问题
五点五十四分
-self-self
六点零七分
如果您使用self关键字获取当前对象,则程序运行的对象只有一个,self-receive只有一个,self-time只有一个人拥有某些特权有一些规则
最大的自我组织
在此处打开一个空文件,然后输入数字,例如,在类或模块定义之外的最高含义
x = 1创建顶级局部变量,下面的代码创建顶级方法
看看谁是最棒的self
puts self回去了
Main是一个自我表达的词
m =类中的self,模块定义中的selftrr
在类和模块定义中,指self、ifade或module对象中的昆虫
下面的实验显示了在self类定义和模块定义中谁是谁
c类put '类:“# self”是c类puts self
模块 "模块:“# self”返回到类级别:“# self”在类或模块的定义区域中时,类和模块对象将自动从上一个示例中获取
实例方法定义中的self
由于Ruby解释器与def/end比较,在实例方法定义中定义的方法定义代码在几秒钟内尚未运行
让我们做个实验
class c def x puts )「类别c、方法x:」put self-end
C =呼叫C.Newc.Xputs
c类,方法x:)这是一个呼叫把这玩意拿掉执行x方法时,self会呼叫实体物件做为c阻抗,显示实体c
独立方法和类方法中的self
当您执行独立方法时,self代表拥有该方法的人
下面的实验首先创建一个对象,在该对象中定义一个独立的方法,然后调用这个独立的方法,然后尝试自我代表的是谁
obj = object . new def obj . show_me put‘,在中显示单个方法show _ me或# {self}”
返回显示呼叫
I型单数方法的fuzzy _ me展示来展示给大家看类方法基本上是在类对象中定义的独立方法,还将进行另一个实验
class def . x put ' class c ' put ' self # { self } ' end c . x输出
类的类方法Cself: C类中,我们可以使用自己来表示类的名称
类def self.x puts '类方法 ' put '如果我们死了
class d & lt cendd.x的输出
class Cself的Class method:作为默认的信息接收者
2016年9月8日
调用方法是向这样的对象发送消息
obj . talk ticket . venue ' ruby . capital会在您呼叫方法时忽略收件者本身
如果有一个名为talk的变量,则只有在使用一个会话调用该变量时,该变量的优先级才较高;在这种情况下,您可以在调用该方法时添加自己
c类def c.no _ dot puts '只要self是c,就不能使用点来调用此方法 ' end no _ do tendtrr
C.no_dot的第一个回电话是没有收件人的
在前面的示例中,self.no_dot与C.no_dot不同,因为我们在c定义的部分中调用方法并看到结果
当我们使用C.no_dot时,我们必须指定接收这封信的人在类定义的部分之外30,也就是说,要调用no_dot
上面的示例是对no_dot方法的两个调用的结果
只要是self C,您就可以在不单击的情况下调用此方法;只要是self C,就不需要单击即可调用此方法;在另一个范例方法中呼叫实体方法30
classdef x puts '这是x '的方法
def y puts '此方法为y。我会呼叫x ' x恩德
c = C.newc.y输出的结果
y方法,我将调用不带句点的x,而y方法运行时,在y中使用x表示self C的位置将发送给self
在这种情况下,您不能忽略对象的插入点;换句话说,如果您要呼叫本身的venue=方法(名为method equal value),则必须这么做,因为Ruby永远是identifier = value的本机值
无句点的方法调用对于在一个方法中使用另一个方法很有用
class personattr _ accessor:第一个_name,:medium _ name,:last_name
defWhole_name n =第一个_name+ n & lt;{中_ name };如果中_name n & lt最后一个_ name结束
大卫=人
大卫。第一个名字= "大卫 "大卫。Last_name = '黑色卡
大卫的全名是大卫
大卫,大卫。mid head _ name = ' area ' put ' David的全名现在将被绑定到一起。{ david.whole _ name } '输出的结果将被绑定到一起
大卫的全名是大卫艾伦贝克
在Ruby中,所有的实体变数都属于目前的物件
我们要做个实验。下面是什么
class c defshow _ var @ v = n现在已开始使用实例变量字符串。 put @ v end @ v = ' instance variables可以出现在任何位置我不知道“”
C.发送输出到new_show_var
上面的代码中有两个@v,一个在方法定义内部,另一个在方法定义外部,它们之间没有关联,也没有实例变量和名称@v,但是
方法定义块中的第一个@v表示c类的每个实例对象都有自己的实例变量
第二个@v属于类对象(如c),类本身也是对象
每个范例变数都会立即执行
类c puts“*”类定义块“puts”-------“@ v =”本@ v”“puts”实例变量:# } n >
def show _ var puts " *范例方法定义图块定义 - p @逆页
c = C.newc.show_var执行程式码输出
*类定义块 self是:c I @ v实例变量属于:ctrr
*实例方法定义块定义 self:是一种动物 v范例变数:@向上 v值:nil是一个域
11点15分了
域表示标识符的可见性,特别是在这两种方法中,变量和常量类型具有不同的作用域规则,它们具有相同名称的x变量
全球范围和全球变化
涵盖整个程式的全域范围变数会使用全域网域,如果您开启新的类别或方法定义,或变更本身的识别名称,则第一个全域变数就是全域
下列范例会使用定义类别之主体的全域变数
$gvar = '我是一个全局变量 ' class c deflection _ global puts $正在进行中
c = c . newc . exam _ global输出
我是一个全局变量
class、module、def总是创建新的本地框架
让我们做个实验
c类a = 1
DefLocal_A = 2个puts a end
放精神
c = C.newc.local_a的输出结果数
12显示的第一个局部变量a位于类定义的局部范围之下,第二个图像a位于方法定义的局部范围之下
当您遇到新的定义区块时,便会建立新的本机范围
再试一次
c类a = 5
模组M a = 4 Rt
模块N a = 3
d类a = 2
Defshow_a = 1个“末端放置a”“末端放置a”“末端放置a”“末端放置a”
d = c::m::d . newd . show _ a的输出结果
23451任何类、模块或方法都将打开一个新的本地类,每个类都可以有自己的本地变量
本地范围和自
先举个例子
class C defx (value_for_a,recurse = false)a = value _ for _ print "现在自: ' p self-put '现在a: ' put a if recur puts n呼叫自己: " x( a的第二个值")put "自己
c = c . newc . x( a的第一个值)返回一个数字
现在self的名字是"不"现在,a的第一个任务
叫你自己现在,在A: a的第二个值调用自身之后,A: a的第一个值实例方法C#x,第一个参数调用其自身的占位符
然后是判决的时候了。如果您是由Recurse变数所指定,则会呼叫x方法,而且没有指定recurse参数的值,预设值为false,因此当呼叫本身时
当您呼叫本身时,value_for_a参数(也就是说,a的第二个值)会设定不同的值,也就是说,当我们呼叫自己时,会设定为x
常数的活动
下午1点06分***
如果您知道在类和方法定义块中定义常量时使用的嵌套,则可以在任何位置访问该常量
例如,我想访问模块类c模块d模块N x = 1的最后一个端点,即在模块n中定义的x常量
m::c::d::x的固定位置可以是相对位置。下面的示例显示了此表达式
M Class D模块使用d::n::n::x模块在end put::n::n::n类中获取d::x部分
有时,您可能不希望使用相对路径,例如,如果您要创建一个类,该类包含字符串(字符串),而该类包含字符串(小提琴)
class violin class string atter _存取子:pitch def initializing(pitch)@ pitch = pitch end
定义@ e = string . new( e)@ a = string . new( a)等我不知道指的是在String上使用时所定义的String类。如果您要使用Ruby的内建String类别,请保留常数
::string . new( hello )类变量,作用域,可见性
下午1点50分
类变量用于维护类状态;例如,@@var部分开头的类变量不是类的作用域;此外,这些变数属于类别阶层架构的范围30,而且类别变数不会出现在其他物件上
例如,使用类方法记录洗车活动,然后记录洗车活动。使用new(make)创建一些汽车
car.add_make(本田)car.add_make(福特)来陪伴您
H = car.new(本田)F = car.new(福特)H2 = car.new(本田)程序显示您创建的汽车的数量
建立新的本田面试建立新的福特。建立新的本田面试在下午2:08 *(世界末日)
下午2点27分
同样的汽车制造商生产了多少h2我们用make_mates做例子
计算h2车的数量,我们不需要每辆车,我们需要教室
"算出公共汽车的总数.""巴士总站"一定要下车
把车的数量加起来我不知道三个我不知道试着制造一辆非生产性的汽车
x = Car.new(品牌x)报告错误
car.rb:二十一世纪的首字母缩写词: no make: brandx。(RuntimeError)程式码如下
类别car @ @ cars = { } @ @ total _ count = 0 attr _ reader:建立自. total _ count @ @ total _ count end
Def self.add_make(制作)@ @ yap & lt make @ @ cars[制作] = 0个端点
def initializationize(make)put { make }:{ make } " @ make = make @ @ @ cars[make]+= 1 @ @ total _ count+= 1埃尔莎利亚}没有汽车制造商:{ make } " end
defmake _ makers @ @ cars[self . make]end类别的顶端会定义三个类别变数@ lava car provider名称的阵列@ @ cars,其中包含资料类型的名称值配对
创建汽车后,必须设置make属性的值,因为类的代码已存在,所以Car类中也没有关于汽车制造商的可写属性
若要存取@@total_count类别变数,car class 30的另一个类别方法是add_make,它会使用参数,在代表汽车制造商的阵列中放置值
以下是每种新车的初始方法,如果有汽车制造商,则需要使用make来增加制造商的汽车数量(@@cars)
还有一种方法可以把汽车制造商生产的所有汽车都退回去
请注意,在类方法(如Car.total_count、Car.add_make)中,类变量是在类中使用的实例方法,如类
类变量和类图层
如前所述,请参阅类别阶层架构的范围范例,而非类别范围变数
class括号@@value = 100end
class Child <括号@@value = 200end
class parent puts @ @ valueend输出的结果是Child Parent的子类,也就是说,与Child共享相同的类变量Child @@value
3点17分
方法存取规则
三点十八分
我们知道Ruby程序会向某人发送信息有时对象希望向他们发送信息但他们不希望别人向他们发送信息这样的话我们就能让他们的方法成为私人投资者
对于访问,有几个访问级别:私有的、受保护的、公开的(public)所有者调用大部分公开访问级别的方法来发送给对象
特别的方法
如果有人想给你做蛋糕的话但你可能不想回答这一切你可能只想说"请做个蛋糕"剩下的留在蛋糕上
使用代码创建文件。他的名字是贝克. rb代码是
类别纸折初始化@ batter = batter @ baked = true end
Egg Ending同学
班·富兰克林
贝克类@ batter = []
【字幕ocr:贾宝玉字幕校对:贾宝玉]
defstir _ batter ending格式
private: pour_flour,add_egg:在stir _ battet上使用自定义方法时,除非添加参数,否则可以为该方法指定名称,直到调用了public或protected的所有实例方法
-不,不,不,不,不,不
b =贝克. newb.add_egg这样,add_egg调用报告的数字错误
你要走了“”:自定义方法搜索“add_egg”因为add_egg是一种特殊的方法,当您调用它时,它是一个不允许指定的收件人
如果我们不通知买家
add_egg可以单独调用此方法吗?如果对象信息不处理,则发送到何处?如果未指定方法调用,则该方法如何调用,则Ruby有效
只有贝克实体才能回应add_egg,也就是说,只有贝克实体才能呼叫add_self范例
自定义方法和独立方法
自订方法与独立方法不同,方法只能属于一个物件的自订方法属于多个物件,但只能在适当的情况下呼叫自订方法
保护方法
保护是一种礼貌和特殊的方式,这是规则
您可以在物件上呼叫受保护的方法,做为预设物件的x实体、攻击类别或主要类别的实体
c类def initializing(n)@ n = n个端点
def n @n端
def compare(c)如果c.n > n puts "另一个对象的大小大于或小于另一个对象的大小 " else puts "或小于另一个对象的大小 "而不是protected: nendtrr
这需要一个保护方法,因为c1和c2是同一类的实例对象,所以它使n成为一个保护方法,而不是一个自定义方法,但如果您尝试在c对象上调用n方法,则它是c类的实例
子类还可以使用超类方法继承规则,但您可以将这些规则引入子类
四点三十五分
高级方法
四点三十五分
Ruby是设计类、模块和示例类的最自然的方法,但有时,如果您希望快速编写代码而不是将代码放在类中,则这些方法是最理想的方法
定义顶级方法
定义最高级方法
def talk puts'hello'end,顶级定义的方法作为Object类的实例中的自定义方法运行,此代码显示了对我们的某种攻击
class objectprivatetr
从def talk subtitles ' hello '呼叫这些方法时,必须使用「裸露的文字样式」,也就是说,资讯的接收方可以在任何地方呼叫物件的自订实体方法
再举一个例子
"你好"的结尾
试着不要用" put "字,不要用" put "字,不要用" put "字,不要用" put "字,不要用" put "字,不要用" put "字,不要用" put "字,不要用" put "字,不要用" put "字,不要用" put "
预定义的顶级方法
puts是内置的自定义示例方法,用于查看内核上提供的所有自定义方法
Ruby-e'p核心. private _ instances _ method . sort '的缩写形式