Tag: oop

在没有if … else块的情况下处理Ruby中的ARGV

在一篇关于无条件编程的博客文章中,Michael Feathers展示了如何限制if语句作为降低代码复杂性的工具。 他用一个具体的例子来说明他的观点。 现在,我一直在考虑其他具体的例子,可以帮助我更多地了解无条件/ if更少/更少的编程。 例如,在这个cat clone中有一个if..else块: #!/usr/bin/env ruby if ARGV.length > 0 ARGV.each do |f| puts File.read(f) end else puts STDIN.read end 事实certificateruby有ARGF ,这使得这个程序更加简单: #!/usr/bin/env ruby puts ARGF.read 我想知道ARGF是否不存在如何重构上面的例子所以没有if..else块? 也对其他说明性具体示例的链接感兴趣。

Ruby如何完全面向对象?

所以,我很好奇Ruby是一种完全面向对象的语言。 我偶然发现了一个对我来说不太清楚的问题。 如果我定义一个函数如下 def foo(text) print text end 我在一个类之外定义函数,这个函数如何成为一个对象? 我意识到我可以打电话 foo.class 我得到了NilClass。 这是否意味着foo是NilClass的一个实例? 如果是的话,当我打电话时,它到底是什么意思 foo “hello world” 如果foo是一个对象,当我按上述方式进行语句时,我会调用什么方法。 此外,如果它是一个对象,这是否意味着我可以修改它并添加另一个方法(比如bar),我可以在其中制作以下语句: foo.bar(some variables) 对不起,我在这一点上有点困惑。 非常感谢任何澄清! 谢谢!

什么是“if / unless”等等

考虑到Ruby中的所有东西都是一个对象,我们可以打开irb并输入像4.class和”Text”.class这样的东西来查看一个对象是哪个类,为什么if.class和unless.class没有给出返回值?

Ruby – 在Ruby中扩展内置变量

我想在Ruby中扩展变量的function。 原因是我正在研究类似系统或值检查器的东西(这听起来有点疯狂,但整个想法是长期解释,只是我想扩展默认变量的原因)。 我已经读到在Ruby中,一切都是对象; 所以变量就是对象。 对于可以通过元编程改变的东西,Ruby应该是相当自由的。 是否有某种与我可以扩展的局部变量相关联的“类”? 我想为每个包含类型的字符串表示forms的变量关联一个字符串变量。 此外,我想拦截变量赋值,并在每次为变量赋值新值时执行方法。 这是我可以检查,如果新值根据类型是正确的(存储为变量中的字符串)。 如果Ruby中的局部变量被定义为类的对象,我可以扩展该类或通过ruby mixin修改它。 解决方法是为我的变量创建一个新类(而不是使用Ruby的局部变量中的构建)。 该类可以具有值属性,类型的属性(存储为字符串)以及get和set方法。 这样我可以解决我的问题,但我想在ruby中扩展内置变量,如果可能的话。 目前的工作正在进行中 class Fixnum attr_accessor :tp @tp def mytype ( type ) @tp = type end def typecheck #call typechecker puts “checked” end end 测试代码: a = 3 a.mytype(“nat”) puts a.tp a.typecheck 还有两个问题。 首先 ,我认为不可能向Fixnum添加新的构造函数。 其次 ,我想拦截变量访问,即“b = a”调用a的方法’typecheck’。 但这需要类似于面向方面编程的东西,我不确定这是否可以通过Ruby的元编程方便解决。

向’self’发送消息会导致调用initialize方法吗?

我有两个classFoo和Bar : require ‘pry-byebug’ require ‘fileutils’ class Foo < Pathname include FileUtils def initialize(path) puts "Inside Foo init…" super puts "Side effect happening…" end def some_method puts "Inside some_method inside Foo…" basename.to_s end end class Bar < Foo end bar = Bar.new('bar') # binding.pry bar.some_method 这是输出: Inside Foo init… Side effect happening… Inside some_method inside […]

如何在Rails中建立相互友谊的模型

我知道之前在Stack Overflow上已经提出了这个问题,但答案并没有以我能解释的方式为我做。 我的一般方法受本教程的启发。 我正在尝试做的是为友好用户创建一个非常简单的模型,通过单个记录在两端创建相同的友谊。 在db级别,我只有一个’friendships’表,它只有一个user_id,一个friend_id和一个is_pending布尔列。 在user.rb中,我将关系定义为: has_many :friendships has_many :friends, through: :friendships 在friendship.rb中,我将关系定义为: belongs_to :user belongs_to :friend, :class_name => ‘User’ 如果我添加友谊,我可以访问如下: > a = User.first > b = User.last > Friendship.new(a.id, b.id) > a.friends => # 这是完美的,但我想要的是也能够像其他方向一样: > b.friends 不幸的是,随着关系的定义,我得到一个空集合。 运行的SQL显示它正在搜索user_id = b.id. 如何指定它还应搜索friend_id = b.id?

Rails:attr_accessor在尝试呈现为JSON时不会显示

在我的应用程序中,我有一个模型在下面; class Init < ActiveRecord::Base attr_accessor :clientAvailability attr_accessible :returnCode, :returnMessage, :tokenCode, :updateURL end 在这里,当我稍后添加** attr_accessor **时,当我尝试应用** render json:init **时,即使我将其设置为;它也不显示** clientAvailability **属性; init=Init.new init.clientAvailability=”3″ 当我调试它时,我可以看到它已设置,但是当我尝试将其渲染为json时,它不会简单地显示出来。 可能是我错过的东西?

ruby中的多inheritance类型inheritance

我有一个Base超类和一堆派生类,比如Base::Number , Base::Color 。 我希望能够使用这些子类,就好像我在Number的情况下inheritance了Fixnum一样。 什么是最好的方法,同时仍然让他们适当地回应is_a? Base is_a? Base ? 所以,我应该可以做到 Number.new(5) + Number.new(6) # => 11 Number.new.is_a? Base # => true 我想我可以混入Base,并覆盖is_a?,kind_of? 和instance_of? 方法,但希望有一个更清洁的方式。

如何在初始化父类时返回子类的新实例?

给定一个类层次结构如下: class A def initialize(param) if param == 1 then #initialize and return instance of B else #initialize and return instance of C end end end class B < A end class C < A end 初始化A时是否可以实际初始化并返回B或C的实例? 即my_obj = A.new(param)将导致my_obj成为B类或C类的实例,具体取决于param的值,该值在A.initialize(param)进行检查。 在我的用例中,它在运行时只知道使用哪个子类( B或C )和父类( A )基本上从未真正使用过。 我认为将B或C决定是否为共同祖先的逻辑可能是个好主意。 如果这是不可能的(或不好的风格),我应该在哪里检查param和决定初始化哪个类?

面向对象数据库理论

请推荐一些关于为动态语言实现面向对象数据库的材料(对Ruby感兴趣)。 我意识到OODB没有很好的数学基础,但我能找到的信息仍然不足以让我开始研究新的OODB。 谢谢。