类方法和实例方法有什么区别?
实例方法是访问器(getter和setter),而类方法几乎是其他所有方法吗?
虽然我理解$this当在静态上下文中调用方法时该变量不可用,但为了帮助将我的应用程序组件彼此解耦,我认为从实例调用静态方法是有意义的.例如:
class MyExample{
private static $_data = array();
public static function setData($key, $value){
self::$_data[$key] = $value;
}
// other non-static methods, using self::$_data
}
// to decouple, another class or something has been passed an instance of MyExample
// rather than calling MyExample::setData() explicitly
// however, this data is now accessible by other instances
$example->setData('some', 'data');
Run Code Online (Sandbox Code Playgroud)
是否有计划弃用此类功能,或者我是否愿意期待对此的支持?我一起工作error_reporting(-1)以确保一个非常严格的开发环境,并且目前还没有任何问题(PHP 5.3.6)但是我知道反向变得不受支持; 也就是说,静态调用实例方法.
有没有办法在len()不修改类的情况下使用实例方法?
我的问题的例子:
>>> class A(object):
... pass
...
>>> a = A()
>>> a.__len__ = lambda: 2
>>> a.__len__()
2
>>> len(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'A' has no len()
Run Code Online (Sandbox Code Playgroud)
注意:
A将__len__附加不同的方法A在什么样的情况下代码:
module M
extend self
def greet
puts "hello"
end
end
Run Code Online (Sandbox Code Playgroud)
使用更有利于说:
module M
def self.greet
puts "hello"
end
end
Run Code Online (Sandbox Code Playgroud)
在顶部,一个是扩展的实例方法,后者只是一个类方法,但在调用任一方法时,你必须使用M.greet,对吧?我很好奇是否有人可以说明何时使用一个代码而不是另一个代码.谢谢!
我对使用方法与C#中的对象进行交互的不同方式有点困惑,特别是以下主要设计差异和后果:
例:
public class MyPoint
{
public double x { get; set; }
public double y { get; set; }
public double? DistanceFrom(MyPoint p)
{
if (p != null)
{
return Math.Sqrt(Math.Pow(this.x - p.x, 2) + Math.Pow(this.y - p.y, 2));
}
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
如果您只需将方法放在类定义中就可以完成所需的结果,那么为什么POCO与静态辅助类或扩展方法结合起来会更好?
这个问题类似于为什么Ruby文档中的方法前面有一个井号?
我明白了为什么在Ruby中的实例方法与井号进行,有助于区分谈论SomeClass#someMethod的SomeObject.someMethod,并允许rdoc工作.我理解PrototypeJS的作者钦佩Ruby(有充分理由),因此他们在文档中使用了散列标记约定.
我的问题是:这是JavaScript开发人员的标准做法还是只是原型开发人员这样做?
问另一种方式,我在评论/文档中引用实例方法是否合适SomeClass#someMethod?或者我的文档是否应该引用``SomeClass.someMethod`?
我想知道我是否可以强迫这种情况发生
class A
def bomb ; "bomb" ; end
end
class B ; end
bomb = A.instance_method(:bomb)
b = B.new
bomb.bind(b)
Run Code Online (Sandbox Code Playgroud)
目前它抛出错误TypeError:bind参数必须是A的实例
我发现这对于我可以用这些未绑定的方法做的非常有限,可能性有点限制.在这些情况下(我不仅仅指幂等函数)它会有意义吗?并且执行错误就足够了,如果我将处理A中未在B中复制的变量,我真的很想知道如何强制这个绑定.
class << self
attr_accessor :n, :totalX, :totalY
end
Run Code Online (Sandbox Code Playgroud)
上面的语法用于定义类实例变量.但是当我考虑语法含义时,它对我没有任何意义,所以我想知道这种类型的语法是否用于任何其他类型的定义.我在这里的困惑是:
class << self
Run Code Online (Sandbox Code Playgroud)
追加运算符通常意味着"向左侧的对象添加右侧的内容".但是在这个块的上下文中,如何将"将此块的内容放入类实例的定义而不是实例"?
出于同样的原因,我很困惑为什么在一个上下文类中,<< self可以定义类实例变量,而在另一个上下文它似乎创建了类变量,例如:
class Point
# Instance methods go here
class << self
# Class methods go here
end
end
Run Code Online (Sandbox Code Playgroud) ruby class-method class-variables class-instance-variables instance-methods
假设我有这个程序:
class Foo {
public:
unsigned int bar () {
static unsigned int counter = 0;
return counter++;
}
};
int main ()
{
Foo a;
Foo b;
}
Run Code Online (Sandbox Code Playgroud)
(当然这个例子没有任何意义,因为我显然将"counter"声明为私有属性,但它只是为了说明问题).
我想知道C++在这种情况下的行为:bar()方法中的变量"counter"对于每个实例都是一样的吗?
我有一个包含这个类方法的类:
def self.get_event_record(row, participant)
event = Event.where(
:participant_id => participant.id,
:event_type_code => row[:event_type],
:event_start_date => self.format_date(row[:event_start_date])
).first
event = Event.new(
:participant_id => participant.id,
:event_type_code => row[:event_type],
:event_start_date => self.format_date(row[:event_start_date])
) if event.blank?
event
end
Run Code Online (Sandbox Code Playgroud)
我在同一个类中也有一个实例方法:
def format_date(date)
parsed_date = date.split('/')
# if month or day are single digit, make them double digit with a leading zero
if parsed_date[0].split("").size == 1
parsed_date[0].insert(0, '0')
end
if parsed_date[1].split("").size == 1
parsed_date[1].insert(0, '0')
end
parsed_date[2].insert(0, '20')
formatted_date = parsed_date.rotate(-1).join("-")
formatted_date
end
Run Code Online (Sandbox Code Playgroud)
我得到一个'未定义的方法'错误#format_date.( …
instance-methods ×10
class-method ×4
ruby ×4
c# ×1
c++ ×1
deprecated ×1
javascript ×1
methods ×1
module ×1
objective-c ×1
oop ×1
php ×1
poco ×1
python ×1
this ×1