我知道Ruby的。然而,让我沮丧的是Ruby是如何使方法成为私有的。
我们通常定义如下类:
class Cat
def initialize(name)
@name = name
end
def say_name
puts @name
end
end
#initialize似乎是与#say_name一起公开定义的。Ruby是如何在类定义之后使#initialize成为私有的?
Ruby中的方法可见性(公共的、受保护的和私有的方法)已经在等地方得到了很好的解释。但在Ruby on Rails中,由于框架的设置方式,它似乎与常规的Ruby应用程序略有不同。那么,在Rails模型、控制器、帮助器、测试等中,什么时候使用受保护或私有方法是合适的?
编辑:感谢你到目前为止的回答。我理解Ruby中受保护和私有的概念,但我更想了解这些类型的可见性在Rails应用程序的各个部分(模型、控制器、帮助器、测试)的上下文中的典型使用方式。例如,公共控制器方法是动作方法,应用程序控制器中的受保护方法用于需要由多个控制器访问的“助手方法”,等等。
我想知道,如果我写一个基类的函数,并修改该函数中的子类实例变量,ruby如何区分它们?例如:
class Parent
def change_name
@name = 'Parent'
end
end
class Subclass < Parent
def initialize
@name = "subclass"
end
def get_name
@name
end
end
sub_class = Subclass.new
sub_class.change_name
sub_class.get_na
我的代码如下:
class A
private
def p_method
puts "I'm a private method from A"
end
end
class B < A
def some_method
p_method
end
end
b = B.new
b.p_method # => Error: Private method can not be called
b.some_method # => I'm a private method from A
b.some_method调
我目前正在尝试理解Ruby中的封装机制是如何工作的:
class A
def public_method_A; p private_method; end;
private
def private_method; 'A'; end;
end
class B < A
def public_method_B; p private_method; end;
private
def private_method; 'B'; end;
end
现在,当我尝试运行这段代码时,我得到的结果如下:
1. > A.ne
朋友们,我正在学习ruby,最近刚从JAVA搬过来。在JAVA中,我可以使类的成员变量成为静态变量,并且该成员变量在类的实例中保持不变。我如何在ruby中实现同样的功能。我在我的ruby类中做了这样的事情:
class Baseclass
@@wordshash
end
到目前为止,这似乎达到了我测试的目的,即@@wordhash在Baseclass的实例中保持不变。我的理解正确吗。
另外,我希望在类中有一个成员方法,它等同于JAVA中的静态方法(我不需要有类的实例来访问它)。我该怎么做呢?例如,我希望在基类中有一个像getwordshash()这样的方法,它返回@@wordshash
在元编程Ruby中,我看到了以下代码
class String
def to_alphanumeric
gsub /[^\w\s]/, ''
end
end
在这里,它向标准类字符串添加了一个方法to_alphanumeric,该方法将标点符号替换为空格。让我困惑的是,既然我们没有指定gsub在哪个对象上工作,Ruby怎么知道这里我们实际上是指gsub在字符串obj本身上工作,而不是其他东西?或者换一种方式,Ruby会自动将其重写为self.gsub吗?
这并不是特定于Ruby的,但我现在恰好正在使用Ruby。
下面是一个提供文本打印功能的类。
class Printer
# some static methods
def self.fancy_print(text)
# do fancy formatting
end
def self.print(text)
fancy_print(text)
end
# some instance methods
def initialize(text)
@text = text
end
def print
#somehow
ruby类实例的东西让我头疼。考虑到这点我理解..。
class Foo
@var = 'bar'
end
...that @var是创建的类实例上的一个变量。
但是如何创建一个子类可覆盖类变量呢?
下面是我在Python中要做的一个例子:
class Fish:
var = 'fish'
def v(self):
return self.var
class Trout(Fish):
var = 'trout'
class Salmon(Fish):
var = 'salmon'
print Tr
在Ruby中,我们可以很容易地引用一个方法,并以类似于回调的方式以如下所示的方式传递:
my_method = method(:method_name)
如何引用在另一个类上定义的类方法?
所以如果我有:
class MyClass
class << self
def my_method
// ... do stuff
end
end
end
如何引用在method(...)调用中使用的不同类中的方法?
如何绕过C#中不一致的可访问性错误?
我需要将一个指向链表中节点的指针传递给一个方法。当我这样做时,我得到一个“编译器错误CS0051”
示例下面的示例生成CS0051:
// CS0051.cs
public class A
{
// Try making B public since F is public
// B is implicitly private here
class B
{
}
public static void F(B b) // CS0051
{
}
public static void Main()
{
}
}
这是
前言:这是在Rails应用程序的上下文中。然而,这个问题是针对Ruby的。
假设我有一个Media对象。
class Media < ActiveRecord::Base
end
我已经在几个子类中扩展了它:
class Image < Media
def show
# logic
end
end
class Video < Media
def show
# logic
end
end
在Media类中,我想从适当的子类调用show的实现。因此,在媒体中,如果self是一个Video,那么它将调用视频的show方法。如果self是一个
我正在从事的项目对DAOs的结构与下面的一个类似:
/**
* Base DAO class
*/
@Transactional
public class JPABase {
@PersistenceContext
private EntityManager entityManager;
public void persist(Object entity) {
entityManager.persist(entity);
}
//some more methods in here
}
和
/**
* Generic DAO class implemen
我在super(i, Material.wood)线路上遇到麻烦了。它说“收缩器调用必须是构造函数中的第一个语句”。我不知道该做什么,也不知道它意味着什么,所以如果你有一个想法,或者想测试它,让我知道如何修复它,我会非常感激它!
mod_new
package net.minecraft.src;
public class mod_new extends BaseMod {
public static Object ruby;
public mod_new(int i, Material rock) {
super(i, rock);
//