我有一个Ruby类.我想从参数获取一个实例变量到该类中的方法.我可以将所有实例变量作为数组获取:
self.instance_variables
Run Code Online (Sandbox Code Playgroud)
但是,我想获取名为的实例变量arg,具体如下:
class MyClass
def get_instance_variable(arg)
hash_of_instance_variables[arg]
end
end
object.get_instance_variable('my_instance_var')
Run Code Online (Sandbox Code Playgroud)
我该如何计算hash_of_instance_variables?
我发现了一篇有趣的文章,描述了如何在Objective-C 2.0中,在实现文件中声明实例变量.考虑这个例子:
@interface MyClass {}
@end
@implementation MyClass {
NSObject *obj1;
NSObject *obj2;
}
@end
Run Code Online (Sandbox Code Playgroud)
注意实例变量obj1,并obj2在不声明的属性.由于它们未使用@property语句声明,因此没有相应的所有权限定符,例如weak/ strong.
我的问题是,使用自动引用计数(ARC)的项目是否记得清理以这种方式声明的对象?任何解决这一具体问题的文件都将受到赞赏.
我主要使用PHP和Java编写代码,但我偶尔会在项目的前端工作并使用JavaScript.我通常以不同于下面的方式创建对象,但是我遇到了这个问题,我感兴趣的是语法与我通常编程的类似.
我正在四处寻找,试图找出如何使用下面的语法在JavaScript类中使用实例变量.我已经尝试通过name;,或_name;,或者var name;所有这些先前的变量声明实例变量并添加= null;,但仍然在我的控制台中出错.错误主要是my-file.js:2 Uncaught SyntaxError: Unexpected identifier.我只是想通过构造函数设置我的实例变量.
如何使用JavaScript中的实例变量,使用下面的语法?
class MyClass {
var _name;
constructor(name) {
_name = name;
alert("Hello world, from OO JS!");
this.myFunction();
}
myFunction() {
document.getElementById("myElement").addEventListener("click", function() {
console.log("Ant's function runs. Hello!");
});
}
}
window.onload = function() {
var person = "John Smith";
var myClass = new MyClass(person);
}
Run Code Online (Sandbox Code Playgroud) 我倾向于在我的类中专门使用属性,特别是现在您可以在类扩展中声明属性,这要归功于现代的Objective-C 2.0运行时 - 我使用此功能来创建"私有"属性.
我的问题是,是否有任何理由再次在类接口中声明ivars.我更喜欢面向公众的界面尽可能地简洁和干净,只是揭示我班级中相关的方面.
例如,我倾向于做以下事情:
MyClass.h:
@interface MyClass : NSObject
@property (nonatomic, copy) NSString * publicString;
@property (nonatomic, copy, readonly) NSString * readOnlyString;
@end
Run Code Online (Sandbox Code Playgroud)
MyClass.m:
@interface MyClass ()
@property (nonatomic, copy, readwrite) NSString * readOnlyString;
@property (nonatomic, copy) NSString * privateString;
@end
@implementation MyClass
@synthesize publicString = publicString_;
@synthesize readOnlyString = readOnlyString_;
@synthesize privateString = privateString_;
- (void)init
{
self = [super init];
if (self != nil)
{
self.publicString = @"Public String";
self.readOnlyString = @"Read-Only String";
self.privateString …Run Code Online (Sandbox Code Playgroud) 我有很多动作方法,不需要创建实例变量来呈现视图,因为这些方法只会重定向到其他控制器的其他动作.我想知道:为了遵循Rails的惯例总是创建实例变量是一个好习惯,或者没有这样的事情.我的直觉是局部变量降低了内存成本,但代码看起来并不漂亮.
对不起这个菜鸟问题...让我们说:
class TestMe
attr_reader :array
def initialize
@array = (1..10).to_a
end
Run Code Online (Sandbox Code Playgroud)
结束
然后可以这样做:
>> a = TestMe.new
=> #<TestMe:0x00000005567228 @x=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]>
>> a.array.map! &:to_s
=> ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
>> a.array
=> ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
Run Code Online (Sandbox Code Playgroud)
编辑我在某处读到暴露数组实例变量是"坏OO".如果这是真的,为什么?
是否有任何计划实现类似于在方法参数列表中指定实例变量名称的CoffeeScript功能的ruby行为?喜欢
class User
def initialize(@name, age)
# @name is set implicitly, but @age isn't.
# the local variable "age" will be set, just like it currently works.
end
end
Run Code Online (Sandbox Code Playgroud)
我知道这个问题:在Ruby中我可以在initialize方法中以某种方式自动填充实例变量吗?,但所有的解决方案(包括我自己的)似乎都不符合ruby简单哲学.
并且,这种行为会有任何缺点吗?
UPDATE
其中一个原因是红宝石社区的DRY(不要重复自己)哲学.我经常发现自己需要重复参数变量的名称,因为我希望将它分配给同名的实例变量.
def initialize(name)
# not DRY
@name = name
end
Run Code Online (Sandbox Code Playgroud)
我能想到的一个缺点是,如果一个方法没有正文,它可能看起来就像什么都没做.如果您正在快速扫描,这可能看起来像一个无操作.但我认为,只要有时间,我们就可以适应.
另一个缺点:如果您在正文中设置其他实例变量,并且您尝试通过将所有分配放在开头可读,则可能需要更多的认知"权力"才能看到分配也发生在参数列表中.但我不认为这比看到一个常量或方法调用并且不得不跳到它的定义更难.
# notice: instance var assignments are happening in 2 places!
def initialize(@name)
@errors = []
end
Run Code Online (Sandbox Code Playgroud) 当我们知道它的字符串名称时,是否有一种方法(元编程?)来读/写一个实例变量?
例如,我在类方法中使用了@my_var实例变量.在这个过程中,我将拥有一个字符串"my_var",告诉我更改@my_var实例变量.
当然我可以使用"if"语句,但我希望它更具动态性,因为我的方法中可能有许多不同的实例变量.
我正在考虑使用"my_var".classify和其他东西......
有人有线索吗?
谢谢你的帮助
不确定类型提示实例变量的Python约定 - 我一直在__init__构造函数参数中执行它们,如下所示:
class LoggedVar(Generic[T]):
def __init__(self, value: T, name: str, logger: Logger) -> None:
self.name = name
self.logger = logger
self.value = value`
Run Code Online (Sandbox Code Playgroud)
链接到上面的代码段:https://docs.python.org/3/library/typing.html#user-defined-generic-types
但我也看到PEP约定注释实例变量(下面的代码段),然后在__init__参数中进行类型提示:
class BasicStarship:
captain: str = 'Picard' # instance variable with default
damage: int # instance variable without default
stats: ClassVar[Dict[str, int]] = {} # class variable`
def __init__(self, damage: int, captain: str = None):
self.damage = damage
if captain:
self.captain = captain # Else keep the default …Run Code Online (Sandbox Code Playgroud) python conventions instance-variables type-hinting python-3.x
PHP允许变量保存如下函数:
$f = function($a,$b) {
print "$a $b";
};
$f("Hello","World!"); //prints 'Hello World!'
Run Code Online (Sandbox Code Playgroud)
这对我来说很好.我正在尝试将一个函数传递给一个类并设置一个实例变量来保存该函数,但运气不佳:
class Clusterer {
private $distanceFunc;
public function __construct($f) {
$this->distanceFunc = $f;
print $f(1,7); //works
print $this->distanceFunc(1,7); //exceptions and errors abound
}
}
$func = function($a,$b) {
return abs($a-$b);
}
$c = new Clusterer($func);
Run Code Online (Sandbox Code Playgroud)
我在这里做错了吗?错误是该函数不存在所以我的猜测是它找到一个具有该名称的类函数(没有一个),然后放弃而不是寻找变量......我怎么能让它查看$ this-> distanceFunc作为变量?
编辑:所以在从下面的答案的建议后,我找到了一个解决方案,它是一个函数来包装调用.例如,我的班级现在是:
class Clusterer {
private $distanceFunc;
public function __construct($f) {
$this->distanceFunc = $f;
print $f(1,7); //works
print $this->distanceFunc(1,7); //exceptions and errors abound
}
private function distanceFunc($a,$b) {
$holder = …Run Code Online (Sandbox Code Playgroud) ruby ×3
class ×2
arrays ×1
constructor ×1
conventions ×1
getter ×1
javascript ×1
methods ×1
objective-c ×1
oop ×1
php ×1
properties ×1
python ×1
python-3.x ×1
type-hinting ×1