Tag: oop

为什么Ruby人说他们不需要接口?

ruby与其他OOP语言有什么不同(例如:PHP)会使接口无用吗? 它有什么替代品吗? 编辑: 一些澄清: 在其他语言(例如:PHP)中,您不需要“接口”(在代码级别它们不是必需的)。 您可以使用它们签订合同,以改进软件的架构。 因此,肯定’在ruby中你不需要接口/在其他语言中你需要接口,因为XXX’是错误的。 不,mixins不是接口,它们是完全不同的东西(PHP 5.4实现mixins)。 你有没有使用过接口? 是的,PHP是OOP。 语言不断发展,欢迎来到现在。

如何在Rails中为我的控制器和模型提供方法?

我在我的Rails应用程序中有一个私有方法连接到Amazon S3,执行传递的代码块,然后关闭与S3的连接。 看起来像这样; def S3 AWS::S3::Base.establish_connection!( :access_key_id => ‘Not telling’, :secret_access_key => ‘Really not telling’ ) data = yield AWS::S3::Base.disconnect data end 它被称为这样(作为一个例子); send_data(S3 {AWS::S3::S3Object.value(“#{@upload_file.name}”,’bucket’)}, :filename => @upload_file.name) 我在我的控制器和模型中以多种方式调用此方法,因此将它作为私有方法包含在两个类中。 这很好用,我很满意,但它不是很干。 如何让我的模型和控制器都可以访问此方法,但只能让代码出现一次? 这是一个Ruby问题而不是Rails问题,反映了我对OOP的新见解。 我猜一个模块或混合就是答案,但到目前为止我还没有真正使用过这两个模块,需要一点点手握。 谢谢。

如何在rails中使用self关键字

关于rails中的关键字“self”,让我们以下面的代码片段为例。 我知道关键字是指类本身的实例,例如表达式“self.encrypted_pa​​ssword”。 无论如何,我很少知道为什么作为右侧参数传递的属性“password”也没有以self关键字作为前缀? 任何人都可以启发我什么时候使用或不使用我的例子后的self关键字给? class User true, :confirmation => true, :length => { :within => 6..40 } before_save :encrypt_password private def encrypt_password self.encrypted_password = encrypt(password) end def encrypt(string) string # Only a temporary implementation! end end

Erlang actor与OOP对象有何不同?

假设我有一个像这样定义的Erlang actor: counter(Num) -> receive {From, increment} -> From ! {self(), new_value, Num + 1} counter(Num + 1); end. 同样,我有一个像这样定义的Ruby类: class Counter def initialize(num) @num = num end def increment @num += 1 end end Erlang代码以函数式编写,使用尾递归来维护状态。 但是,这种差异的有意义的影响是什么? 对于我天真的眼睛,这两个东西的接口看起来大致相同:你发送一条消息,状态得到更新,你得到了新状态的表示。 函数式编程经常被描述为与OOP完全不同的范例。 但是Erlang actor似乎完全按照对象应该做的:维护状态,封装并提供基于消息的接口。 换句话说,当我在Erlang actor之间传递消息时,它与我在Ruby对象之间传递消息的方式有何不同? 我怀疑function/ OOP二分法的影响比我看到的要大。 有谁可以指出他们? 让我们撇开这样一个事实,即Erlang actor将由VM调度,因此可以与其他代码同时运行。 我意识到这是Erlang和Ruby版本之间的一个主要区别,但这不是我所得到的。 在其他语言中可以实现并发,包括Ruby。 虽然Erlang的并发性可能表现得非常不同(有时甚至更好),但我并不是真的在询问性能差异。 相反,我对问题的function与OOP方面更感兴趣。

Ruby是按值传递还是按引用传递?

我基本上是一个java开发人员。 我在ruby工作了大约一年。 与java不同,Ruby是一种纯粹的面向对象编程语言。 这是一个疑问。 它是按值传递还是按引用传递? Java作为pass-by-value工作:“当传递基元时,我看到值被复制并传递给方法。但是如果有对象,则引用被复制并传递给方法。引用包含对象的位置在堆中。在方法调用期间,只传递对象的位置。因此不会创建重复的对象。修改相同的对象。“ 但是当我尝试下面的ruby代码片段时,我得到的结果与我在Java中得到的结果相同:“在方法调用期间,数字就像一个原语(比如在java中),而数组就像java中一样完美引用”。 现在,我很困惑。 如果ruby中的所有内容都是对象,那么在方法调用期间为什么数字对象会重复? class A def meth1(a) a = a+5 puts “a inside meth1—#{a}” end def meth2(array) array.pop puts “array inside meth2—#{array}” end end obj1 = A.new aa=5 obj1.meth1(aa) puts “aa—–#{aa}” arr = [3,4,5] obj1.meth2(arr) puts “arr—#{arr}” 结果: 一个内部meth1 — 10 AA —– 5 数组里面的meth2 — 34 ARR — […]

在基于OOP的文本游戏中进行优雅的命令解析

我正在玩Ruby中的MUD /文字冒险(请不要笑)。 任何人都可以给我任何指向优雅的,基于oop的解析输入文本的解决方案吗? 我们在谈论的不仅仅是“把魔杖放在桌子上”这里更复杂。 但一切都需要柔软; 我想稍后无痛地扩展命令集。 我目前的想法,略有简化: 每个项目类(框,表,房间,播放器)都知道如何识别“属于”它的命令。 游戏类理解一种特定于域的语言,涉及诸如“在对象Y内移动对象X”,“显示对象X的描述”等操作。 如果游戏类识别输入命令,则会询问房间中的每个项目。 首先说是赢。 然后它将控制权传递给处理命令的item类中的方法。 此方法重新命名DSL中的命令,将其传递回游戏对象以使其发生。 必须有陈旧,优雅的方式来做这些事情。 但是,似乎无法谷歌任何东西。

Ruby中不是对象的“东西”的例子

“一切都是对象”是我学习Ruby的第一件事,但是在Peter Cooper的Beginning Ruby中:从新手到专业 ,提到“Ruby中几乎所有东西都是对象”。 你能给我一些Ruby中没有对象的例子吗?

像`self`这样引用实例的Ruby方法

Ruby中是否有一个方法引用类的当前实例,就像self引用类本身一样?

我应该使用类方法还是实例方法,为什么?

在我的Rails应用程序中,创建业务时我有一个包含以下字段的表单: 基本上当我创建一个企业时,如果他们选中此框,我需要它来运行类似下面的代码: def set_default_company(company, user) exists = DefaultCompany.find(user.id) if exists exists.update_attributes(company: company) else DefaultCompany.create(company: company, user: user) end end 在学习的过程中,我通常会在我的控制器中执行这些操作,但我正在尝试遵循最佳实践并使用胖模型,瘦的控制器,所以我想要使用这样的逻辑: def create @company = Company.new(params[:company]) if @company.save if params[:default_company] Company.set_default_company(@company.id, current_user.id,) end flash[:notice] = “Company was successfully created.” redirect_to @company else redirect_to new_company_path end end 这是我对是否使用类方法或实例方法,调用set_default_company感到困惑的地方。 他们似乎都会工作,我看不到其中任何一方的好处。 除了给我任何关于使用哪种方法的信息之外,如果有人可以向我展示一个简短的写作实现,作为一个类方法与实例方法,它可以让我更好地理解为什么。 这是我写它们的方式: def self.set_default_company(company, user) # Logic here […]

在Ruby中inheritance类级实例变量?

我希望子类从其父级inheritance类级实例变量,但我似乎无法弄明白。 基本上我正在寻找这样的function: class Alpha class_instance_inheritable_accessor :foo # @foo = [1, 2, 3] end class Beta < Alpha @foo << 4 def self.bar @foo end end class Delta < Alpha @foo << 5 def self.bar @foo end end class Gamma < Beta @foo << 'a' def self.bar @foo end end 然后我想要这样输出: > Alpha.bar # [1, 2, […]