天道酬勤,学无止境

在 Struct 实例中创建动态属性(Create dynamic attribute in the Struct instance)

问题

是否可以在Struct实例中动态创建属性?

class Person < Struct.new(:name)
end

p = Person.new("Bilbo")
p[:surname] = "Jenkins" # does not work
回答1

您可以使用OpenStruct

require 'ostruct'

p = OpenStruct.new(name: "Bilbo")
p[:surname] = "Jenkins"

p.surname # => "Jenkins"
回答2

您可以通过执行以下操作在您的Person类上定义新方法:

Person.send(:define_method, :surname){@surname}
Person.send(:define_method, :surname=){|x|@surname=x}

我更喜欢define_method而不是instance_eval因为我会尽可能省略eval

回答3
Person = Struct.new(:name) Person.instance_methods(false) #=> [:name, :name=] p = Person.new("Bilbo") #=> #<struct Person name="Bilbo"> Does `p` have an instance variable `@name` whose value is `"Bilbo"`? p.instance_variables #=> [] p.members #=> [:name] p.name #=> "Bilbo" p.name = "cat" p.name #=> "cat" p.instance_variable_set('@surname', 'Jenkins') #=> "Jenkins" p.instance_variables #=> [:@surname] p.instance_variable_get('@surname') #=> "Jenkins" p.class.instance_eval do attr_accessor :surname end p.surname #=> "Jenkins" p.surname = 'cat' #=> "cat" p.surname #=> "cat" p.class.instance_methods(false) #=> [:name, :name=, :surname, :surname=]
标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何将文件操作附加到平台驱动程序中的 sysfs 属性?(How to attach file operations to sysfs attribute in platform driver?)
    问题 我为我们开发的外围设备编写了一个平台驱动程序,并希望向 sysfs 公开一些配置选项。 我已经设法在探测函数中使用属性结构(见下文)和sysfs_create_file创建了适当的文件,但我无法弄清楚如何将显示/存储函数附加到平台驱动程序中的结构。 我在网上找到的大多数资源都使用device_attribute结构或类似的东西来创建它们的文件,这在这里也合适吗? 对于平台驱动程序,还有另一种方法吗? 我的属性结构如下所示: struct attribute subkey_attr = { .name = "subkeys", .mode = S_IWUGO | S_IRUGO, }; 我使用此调用注册文件: riddler_kobject = &pdev->dev.kobj; ret_val = sysfs_create_file(riddler_kobject, &subkey_attr); 回答1 归结为下一个: 将struct device (来自您的struct platform_device )中的现有 kobject 重用于sysfs_create_group() (而不是创建您自己的kobject ) 使用DEVICE_ATTR()声明struct device_attribute而不是常规的__ATTR() ,后者创建struct kobj_attribute
  • 在数据结构中创建动态数组时在 C 中编译错误(Compiling errors in C while creating a dynamic array inside data structure)
    问题 所以我有一个程序来实现 B 树,但是我遇到了一些烦人的编译错误。 B-Tree 结构正在工作,但我必须实现一个功能来接受树的顺序作为输入,这导致了一些问题。 我的错误是: Prelim.c:29:38: 错误:在 '=' 标记之前应为 ':'、'、'、';'、'}' 或 '属性' Prelim.c:26:6: 错误:灵活的数组成员不在结构的末尾 受影响的代码是: struct bTreeNode { int count; int value[]; // This is line 26 struct bTreeNode *branch[]; struct bTreeNode *branch[order - 1] = malloc(sizeof(order)); // This is line 29 int value[order - 1] = malloc(sizeof(order)); }; 我的问题有两个部分:首先,为什么会发生这些错误,其次,我该如何正确实施这个想法? (如果需要,我可以提供额外的代码,并将订单声明为全局变量)。 非常感谢你的帮助! 回答1 “为什么会发生这些错误” 在您的代码中, branch是一个bTreeNode指针数组,因此您必须告诉编译器branch的长度。 试试这个代码: #define ORDER 10; // hard-coded
  • 在Django中创建动态模型字段(Creation of dynamic model fields in django)
    问题 这是有关django的问题。 我有一个模特说“汽车”。 这将具有一些基本字段,例如“颜色”,“车辆所有者名称”,“车辆成本”。 我想提供一个表格,用户可以根据他要添加的汽车添加额外的字段。 例如,如果用户添加“汽车”,则他将在运行时动态地在表单中添加其他字段,例如“汽车里程”,“校准制造商”。 假设用户想要添加“卡车”,他将添加“可以运载的货物”,“许可证”等。 如何在Django中实现这一目标? 这里有两个问题: 如何提供用户可以在运行时添加新字段的表单? 如何将字段添加到数据库中以便以后可以检索/查询? 回答1 有几种方法: 键/值模型(简单,良好的支持) TextField中的JSON数据(简单,灵活,无法轻松搜索/编制索引) 动态模型定义(不是那么容易,很多隐藏的问题) 听起来好像您想要最后一个,但是我不确定这对您来说是最好的。 Django非常易于更改/更新,如果系统管理员需要额外的字段,只需为其添加字段并使用向南迁移即可。 我不喜欢通用键/值数据库架构,像Django这样的强大框架的全部要点是,您可以轻松编写和重写自定义架构,而无需求助于通用方法。 如果您必须允许站点用户/管理员直接定义其数据,我相信其他人将向您展示如何执行上述前两种方法。 第三种方法是您所要的,更疯狂的是,我将向您展示如何做。 我不建议几乎在所有情况下都使用它,但有时它是合适的。 动态模型
  • 在 Python 中创建具有任意属性的对象的最短方法?(Shortest way of creating an object with arbitrary attributes in Python?)
    问题 嘿,我刚开始想知道这个,因为我遇到了一个期望对象具有特定属性集的代码(但没有指定这个对象应该是什么类型)。 一种解决方案是创建一个具有代码期望属性的新类,但是当我调用其他代码也需要具有(其他)属性的对象时,我必须创建越来越多的类。 一个较短的解决方案是创建一个通用类,然后在它的实例上设置属性(对于那些想使用object实例而不是创建新类的人来说,这是行不通的,因为object实例不允许 new属性)。 我想出的最后一个最短的解决方案是创建一个类,该类带有一个接受关键字参数的构造函数,就像dict构造函数一样,然后将它们设置为属性: class data: def __init__(self, **kw): for name in kw: setattr(self, name, kw[name]) options = data(do_good_stuff=True, do_bad_stuff=False) 但我不禁觉得我错过了一些明显的东西......难道没有内置的方法来做到这一点(最好在 Python 2.5 中支持)? 回答1 使用__dict__可以稍微简化原始代码: In [1]: class data: ...: def __init__(self, **kwargs): ...: self.__dict__.update(kwargs) ...: In [2]: d
  • 如何在C#中创建自定义属性(How to create a custom attribute in C#)
    问题 我已经尝试了很多次,但是仍然无法理解自定义属性的用法(我已经浏览了很多链接)。 谁能给我解释一个带有代码的自定义属性的非常基本的示例吗? 回答1 尽管创建自定义属性的代码非常简单,但了解什么是属性非常重要: 属性是编译到程序中的元数据。 属性本身不会为类,属性或模块添加任何功能,而只是为数据添加任何功能。 但是,使用反射,可以利用这些属性来创建功能。 因此,例如,让我们看一下Microsoft企业库中的验证应用程序块。 如果看一个代码示例,您将看到: /// <summary> /// blah blah code. /// </summary> [DataMember] [StringLengthValidator(8, RangeBoundaryType.Inclusive, 8, RangeBoundaryType.Inclusive, MessageTemplate = "\"{1}\" must always have \"{4}\" characters.")] public string Code { get; set; } 从上面的代码片段中,您可能会猜到,只要更改了代码,就会始终根据Validator的规则进行验证(在示例中,至少包含8个字符,最多8个字符)。 但是事实是,属性什么也没做。 如前所述,它仅将元数据添加到属性。 但是
  • 在powershell中创建一个具有动态属性名称的类(Create a class with dynamic property names in powershell)
    问题 我需要能够在 powershell 中有一个类,我可以在其中动态创建该类的属性名称。 例如, $binFiles = Get-ChildItem $files -Include *.BIN -recurse $binFiles.Name 这将打印如下内容: 文件1.BIN 这个文件.BIN ... 文件其他.BIN 我希望这些文件名是我将多次创建的类中属性的名称。 这甚至可能吗? Class myItem { [String]$"File1.BIN" [String]$"ThisFile.BIN" .... [String]$"FileOther.BIN" } 回答1 您可以使用Invoke-Expression (解决方案是 PSv5+,因为使用自定义 PS 类): Invoke-Expression @" Class myItem { $((Get-ChildItem $files -Include *.BIN -recurse).ForEach({"[string] `${$($_.Name)}`n "})) } "@ 注意:虽然Invoke-Expression这种特殊使用是安全的,因为您完全控制正在评估的字符串,通常应避免使用 Invoke-Expression。 here-string 将类定义生成为string ,然后Invoke-Expression对其求值
  • 如何在 QML 中创建 Q_GADGET 结构的新实例?(How to create new instance of a Q_GADGET struct in QML?)
    问题 我可以将带有标记为 Q_GADGET 的结构的信号从 C++ 发送到 QML。 是否可以将这样的结构从 QML 发送到 C++ 插槽? 我的代码在第一步失败:在 QML 中创建一个实例。 此代码在第一行失败... var bs = new BatteryState() bs.percentRemaining = 1.0 bs.chargeDate = new Date() DataProvider.setBatteryState(bs) ...有错误: qrc:///main.qml:34: ReferenceError: BatteryState is not defined 我可以将 BatteryStatus 结构从 C++ 发送到 QML,但我想将一个作为单个参数发送回插槽。 这是 BatteryState.h 和 BatteryState.cpp: // BatteryState.h #pragma once #include <QDate> #include <QMetaType> struct BatteryState { Q_GADGET Q_PROPERTY(float percentRemaining MEMBER percentRemaining) Q_PROPERTY(QDate date MEMBER date) public: explicit
  • 如何在C#中创建动态属性?(How do I create dynamic properties in C#?)
    问题 我正在寻找一种创建具有一组静态属性的类的方法。 在运行时,我希望能够从数据库中向该对象添加其他动态属性。 我还想为这些对象添加排序和过滤功能。 我该如何在C#中执行此操作? 回答1 您可能会使用字典,例如 Dictionary<string,object> properties; 我认为在大多数情况下,类似的事情都是这样完成的。 无论如何,使用set和get访问器创建“真实”属性不会获得任何好处,因为它将仅在运行时创建,并且您不会在代码中使用它。 这是一个示例,显示了可能的过滤和排序实现(无错误检查): using System; using System.Collections.Generic; using System.Linq; namespace ConsoleApplication1 { class ObjectWithProperties { Dictionary<string, object> properties = new Dictionary<string,object>(); public object this[string name] { get { if (properties.ContainsKey(name)){ return properties[name]; } return null; } set { properties[name] =
  • 如何在 rails 中创建动态属性别名?(How to create dynamic attribute aliases in rails?)
    问题 在类定义中,我得到了一个我想要返回的属性列表,而不是数据库的值,除非用于存储这些值的容器为 nil: class Label < ActiveRecord::Base CONFIRM_DATA = ["attr1", "attr2"] # "attr1", "attr2" is database fields CONFIRM_DATA.each do |att| alias_attribute "original_#{att}".to_sym, att.to_sym define_method att.to_sym do temp_attr_store[ att.to_sym ] || read_attribute( "original_#{att}".to_sym) end end end 因此,如您所见,我尝试在temp_attr_store存储temp_attr_store一些临时值:它们应该出现而不是 db 值,并希望影响对象的关联。 上面的代码不起作用,所有attr1访问结果为零。 谢谢!
  • 如何使用主干在集合和模型中创建动态 url(how to create dynamic url in collection and model using backbone)
    问题 我的收藏和模型是这样的: detail_userid = 0; detail_contactid = 0; var ContactDetail = Backbone.Model.extend({ urlRoot: URL_CONTACTS1+detail_userid+"/"+detail_contactid }); var ContactDetailCollection = Backbone.Collection.extend({ model: ContactDetail, url: URL_CONTACTS1+detail_userid+"/"+detail_contactid }) 入口是: ContactDetailManagePageModel.prototype.init = function(m,n){ detail_userid = m; detail_contactid = n; var myContactDetails = new ContactDetailCollection(); var contactDetailListView = new ContactDetailListView({ collection: myContactDetails }); myContactDetails.fetch({reset:true}); }
  • 为什么在 c 中实现链表时使用动态内存分配(即 malloc())?(Why use dynamic memory allocation(i.e. malloc()) when implementing linked list in c?)
    问题 好吧,这个问题对业余程序员来说可能听起来很愚蠢。 但严重的是,这让我感到困扰,欢迎对我的这个疑问做出严肃的回答。 我刚刚开始学习我的第一门数据结构课程。 而困扰我的是: 假设使用 C, //Implementing a node struct Node { int data; struct *Node; }; 现在在创建节点时为什么我们使用动态内存分配技术,我们使用 malloc()。 我们不能只创建一个“结构节点”类型的变量。 即类似: struct Node N1; //First node - actually second where !st Node is assumed to be Head. struct Node *Head = &N1; struct Node N2; N2.(*Node) = &N1; 好吧,我的代码的某些部分可能不正确,因为我只是一个初学者并且不精通 C。但是知道您可能已经理解我的基本意思。 为什么我们不创建 Node 类型的 Node 类型的变量来分配内存 t 新节点为什么要进入动态内存分配的复杂性? 回答1 首先,您在声明结构的方式上存在错误。 struct *本身并不表示类型。 您必须提供完整的类型名称: struct Node { int data; struct Node *Node; }
  • 如何使用 Swift 在 Firebase 中创建具有多个属性的用户?(How can I create a user with multiple attributes in Firebase with Swift?)
    问题 我对 Firebase 非常陌生(只有几个小时)并且仍在尝试吸收它的大部分概念。 我遵循了文档,但仍然没有找到我的问题的直接答案。 我的应用程序中有一个注册表单……它需要用户名、姓名、手机等。我使用了 firebase createUser 函数,但它只创建了一个带有电子邮件和密码的用户。 如何创建具有多个属性(姓名、手机、用户名等)的用户? 稍后,我想查询一个用户名并获取与它们相关的所有属性,因此我需要拥有这些属性。 PS 来自 Parse,这不是那么简单。 回答1 传统上,您会在 Firebase 中创建一个 /users 节点,其中包含您想要存储的有关该用户的任何其他信息。 使用 uid (user_id) 作为每个用户的节点名称。 users uid_0 name: "Bill" food: "Pizza" uid_1 name: "Ted" food: "Tacos" 之前已经问过这个问题,所以请在提问之前尝试搜索与您相似的问题。 这里有更多信息 Firebase 用户节点 回答2 我假设由于您将拥有多个用户,因此您将在他们访问您的应用程序之前对他们进行身份验证。 您可以先在 Swift 中创建一个 Struct 文件,如下所示: import Foundation import Firebase struct User { let uid: String let
  • 如何在 XSLT 中创建具有动态属性的元素?(How to create an element in XSLT with a dynamic attribute?)
    问题 我有一些看起来像这样的 XML: <ExtensionObject> <Value xmlns=""> <Key>key01</Key> <StringValue>somewords</StringValue> </Value> <Value xmlns=""> <Key>key01</Key> <NumberValue>12345</NumberValue> </Value> ...........hundreds more Values.............. </ExtensionObject> 我相当乐观地写了这样的 XSLT: <xsl:template match="/ExtensionObject"> <VResult> <xsl:for-each select="Value"> <xsl:variable name="fld"> <Value><xsl:value-of select="Key"/></Value> </xsl:variable> <Result field="$fld"> <Value> <xsl:choose> <xsl:when test="NumberValue"> <xsl:value-of select="NumberValue"/> </xsl:when> <xsl:otherwise> <xsl:value-of
  • 如何在 Python 中创建一个新的未知或动态/扩展对象(How to create a new unknown or dynamic/expando object in Python)
    问题 在 python 中,我们如何在没有预定义类的情况下创建一个新对象,然后动态地向它添加属性? 例子: dynamic_object = Dynamic() dynamic_object.dynamic_property_a = "abc" dynamic_object.dynamic_property_b = "abcdefg" 最好的方法是什么? 编辑因为很多人在评论中建议我可能不需要这个。 问题是我有一个序列化对象属性的函数。 出于这个原因,由于某些构造函数限制,我不想创建预期类的对象,而是创建一个类似的对象,比如模拟,添加我需要的任何“自定义”属性,然后将其反馈给功能。 回答1 只需定义你自己的类来做到这一点: class Expando(object): pass ex = Expando() ex.foo = 17 ex.bar = "Hello" 回答2 使用对象来保存值并不是最 Pythonic 的编程风格。 这在没有良好关联容器的编程语言中很常见,但在 Python 中,您可以使用字典: my_dict = {} # empty dict instance my_dict["foo"] = "bar" my_dict["num"] = 42 您还可以使用“字典文字”一次性定义字典的所有内容: my_dict = {"foo":"bar", "num":42}
  • 是否可以在打字稿中创建动态 getter/setter?(Is it possible to create dynamic getters/setters in typescript?)
    问题 我是打字稿的新手,我正在尝试将我们的应用程序从 es2016 重写为打字稿。 我的任务是拥有一个具有数据属性的类,并使数据对象中的每个元素都可用作类属性。 我被这个javascript代码卡住了: for(let key in this.data) { Object.defineProperty(this, key, { get: function(value:any) { return this.data[key]; }, set: function(value:any) { if (this.data[key] !== value) { this.data[key] = value; this.updatedKeys.push(key); } }, }); } 将 getter/setter 用于打字稿非常容易,但是如果我可以动态创建它们,我会感到困惑吗? interface IData { id: number; [propName: string]: any; } class Model { protected updatedKeys:string[] = []; baseUrl:string = null; data:IData; fields:IData; constructor(data:IData={id:null}, fields:IData={id
  • 如何在 C 中创建具有两个可变大小数组的结构(How to create a structure with two variable sized arrays in C)
    问题 我正在编写一个轻量级的序列化函数,需要在其中包含两个可变大小的数组。 我应该如何跟踪每个的大小? 我应该如何定义结构? 我在这一切都错了吗? 编辑:结果必须是连续的内存块 回答1 这解决了类似的问题 typedef struct { size_t arr_size_1, arr_size_2; char arr_1[0/*arr_size_1 + arr_size_2*/]; } ...; 大小应该在动态大小数据的前面,这样在扩展数组时它就不会移动。 您的结构中不能有 2 个未知大小的数组,因此您必须将它们折叠成一个,然后从第一个指针访问相关数据。 回答2 typedef struct MyStruct_s { int variable_one_size; void* variable_one_buf; int variable_two_size; void* variable_two_buf; } MyStruct; MyStruct* CreateMyStruct (int size_one, int size_two) { MyStruct* s = (MyStruct*)malloc (sizeof (MyStruct)); s->variable_one_size = size_one; s->variable_one_buf = malloc (size_one)
  • spring两大核心:IOC和AOP之详细学习
    spring核心: IOC、AOP 1.IOC概念和原理 什么是IOC (1)控制反转,把对象的创建和对象之间的调用过程,交给spring来实现 (2)使用IOC的目的:降低耦合度; 2.IOC底层原理 2.1 IOC的发展历程: 1.最原始的方式:例如:UserService调用UserDao的方法时,是在UserService中创建UserDao的对象,然后调用UserDao的方法;但这种方式耦合度较高;一旦UserDao发生改变,UserService就需要做出改变,所以出现了工厂类 2.工厂类创建对象:通过工厂类创建对象,然后调用工厂类的方法类调用UserDao类中的方法,这样减低了UserService和UserDao的耦合度,但是这样耦合度还是不够低,所以出现了IOC 3.IOC创建对象 1.xml解析、工厂模式、反射 IOC过程 a.首先通过配置文件,配置要创建的对象 b.创建工厂类: 通过xml解析获取“class”属性:即得到类的路径String classValue=class属性值 通过反射创建对象:Class className=Class.forName(classValue);得到字节码文件 className.newInstance(); 创建新实例 2.2 IOC接口 1.IOC思想是基于IOC容器完成,容器本身就是工厂类 2
  • 使用C ++模板在编译时在AbstractFactory中动态注册构造函数方法(Dynamically register constructor methods in an AbstractFactory at compile time using C++ templates)
    问题 当实现MessageFactory类以使Message对象实例化时,我使用了类似的方法: class MessageFactory { public: static Message *create(int type) { switch(type) { case PING_MSG: return new PingMessage(); case PONG_MSG: return new PongMessage(); .... } } 这项工作正常,但是每次我添加一条新消息时,都必须添加一个新的XXX_MSG并修改switch语句。 经过一些研究,我找到了一种在编译时动态更新MessageFactory的方法,因此我可以根据需要添加任意数量的消息,而无需修改MessageFactory本身。 因为我不需要修改三个不同的位置来添加/删除消息类,所以这可以使代码更简洁,更易于维护: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <inttypes.h> class Message { protected: inline Message() {}; public: inline virtual ~Message() { } inline int getMessageType() const {
  • 在Python中创建NTFS交接点(Create NTFS junction point in Python)
    问题 有没有一种方法可以在Python中创建NTFS交接点? 我知道我可以调用junction实用程序,但是最好不要依赖外部工具。 回答1 我在类似的问题中回答了这个问题,因此我将其回答复制到下面的内容中。 自从写出答案以来,我最终编写了一个纯Python(如果您可以调用仅使用ctypes python的模块)模块来创建,读取和检查可在此文件夹中找到的联结。 希望能有所帮助。 另外,与使用CreateSymbolicLinkA API的答案不同,链接的实现应在支持联结的任何Windows版本上都可以使用。 仅在Vista +中支持CreateSymbolicLinkA。 回答: python ntfslink扩展 或者,如果您想使用pywin32,则可以使用前面提到的方法,并使用以下方法进行阅读: from win32file import * from winioctlcon import FSCTL_GET_REPARSE_POINT __all__ = ['islink', 'readlink'] # Win32file doesn't seem to have this attribute. FILE_ATTRIBUTE_REPARSE_POINT = 1024 # To make things easier. REPARSE_FOLDER = (FILE
  • 如何动态创建局部变量?(How to dynamically create a local variable?)
    问题 我有一个变量var = "some_name" ,我想创建一个新对象并将其分配给some_name 。 我该怎么做? 例如 var = "some_name" some_name = Struct.new(:name) # I need this a = some_name.new('blah') # so that I can do this. 回答1 您不能在Ruby 1.9+中动态创建局部变量(可以通过eval在Ruby 1.8中创建): eval 'foo = "bar"' foo # NameError: undefined local variable or method `foo' for main:Object 但是,它们可以在评估的代码本身中使用: eval 'foo = "bar"; foo + "baz"' #=> "barbaz" Ruby 2.1添加了local_variable_set,但是它也不能创建新的局部变量: binding.local_variable_set :foo, 'bar' foo # NameError: undefined local variable or method `foo' for main:Object 如果不修改Ruby本身,则无法更改此行为。 替代方法是考虑将数据存储在另一个数据结构(例如哈希)中