Class: Data
Instance Method Summary collapse
-
#==(other_data) ⇒ Boolean
Equality—Returns
true
if other_data is equal to this one: they must be of the same class as generated byData::define
, and all values of must be equal (according toObject#==
). -
#eql?(other) ⇒ Boolean
Two structures are equal if they are the same object, or if all their fields are equal (using
Object#eql?
). - #initialize ⇒ Object constructor
- #initialize_copy ⇒ Object
-
#inspect ⇒ Object
Returns a string representation of Data.
-
#members ⇒ Array
Returns an array of strings representing the names of the instance variables.
-
#to_h ⇒ Hash
Create a hash from member names and values.
-
#to_s ⇒ Object
Returns a string representation of Data.
Constructor Details
#initialize ⇒ Object
238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 |
# File 'mruby/mrbgems/mruby-data/src/data.c', line 238
static mrb_value
mrb_data_initialize(mrb_state *mrb, mrb_value self)
{
struct RClass *klass = mrb_obj_class(mrb, self);
mrb_value members = data_s_members(mrb, klass);
mrb_int n = RARRAY_LEN(members);
mrb_value hash;
mrb_get_args(mrb, "H", &hash);
if (mrb_hash_size(mrb, hash) != n) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments");
}
mrb_ary_resize(mrb, self, n);
mrb_value *mems = RARRAY_PTR(members);
for (mrb_int i = 0; i < n; i++) {
if (!mrb_hash_key_p(mrb, hash, mems[i])) {
mrb_raisef(mrb, E_ARGUMENT_ERROR, "undefined data member %v", mems[i]);
}
mrb_ary_set(mrb, self, i, mrb_hash_get(mrb, hash, mems[i]));
}
mrb_obj_freeze(mrb, self);
return self;
}
|
Instance Method Details
#==(other_data) ⇒ Boolean
Equality—Returns true
if other_data is equal to this one: they must be of the same class as generated by Data::define
, and all values of must be equal (according to Object#==
).
Customer = Data.define(:name, :address, :zip)
joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
joe2 = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
jane = Customer.new("Jane Doe", "456 Elm, Anytown NC", 12345)
joe == joe2 #=> true
joe == jane #=> false
297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 |
# File 'mruby/mrbgems/mruby-data/src/data.c', line 297
static mrb_value
mrb_data_equal(mrb_state *mrb, mrb_value s)
{
mrb_value s2 = mrb_get_arg1(mrb);
mrb_value *ptr, *ptr2;
mrb_int len;
if (mrb_obj_equal(mrb, s, s2)) {
return mrb_true_value();
}
if (mrb_obj_class(mrb, s) != mrb_obj_class(mrb, s2)) {
return mrb_false_value();
}
if (RDATA_LEN(s) != RDATA_LEN(s2)) {
return mrb_false_value();
}
ptr = RDATA_PTR(s);
ptr2 = RDATA_PTR(s2);
len = RDATA_LEN(s);
for (mrb_int i=0; i<len; i++) {
if (!mrb_equal(mrb, ptr[i], ptr2[i])) {
return mrb_false_value();
}
}
return mrb_true_value();
}
|
#eql?(other) ⇒ Boolean
Two structures are equal if they are the same object, or if all their fields are equal (using Object#eql?
).
332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 |
# File 'mruby/mrbgems/mruby-data/src/data.c', line 332
static mrb_value
mrb_data_eql(mrb_state *mrb, mrb_value s)
{
mrb_value s2 = mrb_get_arg1(mrb);
mrb_value *ptr, *ptr2;
mrb_int len;
if (mrb_obj_equal(mrb, s, s2)) {
return mrb_true_value();
}
if (mrb_obj_class(mrb, s) != mrb_obj_class(mrb, s2)) {
return mrb_false_value();
}
if (RDATA_LEN(s) != RDATA_LEN(s2)) {
return mrb_false_value();
}
ptr = RDATA_PTR(s);
ptr2 = RDATA_PTR(s2);
len = RDATA_LEN(s);
for (mrb_int i=0; i<len; i++) {
if (!mrb_eql(mrb, ptr[i], ptr2[i])) {
return mrb_false_value();
}
}
return mrb_true_value();
}
|
#initialize_copy ⇒ Object
263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 |
# File 'mruby/mrbgems/mruby-data/src/data.c', line 263
static mrb_value
mrb_data_init_copy(mrb_state *mrb, mrb_value copy)
{
mrb_value s = mrb_get_arg1(mrb);
if (mrb_obj_equal(mrb, copy, s)) return copy;
if (!mrb_obj_is_instance_of(mrb, s, mrb_obj_class(mrb, copy))) {
mrb_raise(mrb, E_TYPE_ERROR, "wrong argument class");
}
if (!data_p(s)) {
data_corrupted(mrb);
}
mrb_ary_replace(mrb, copy, s);
mrb_obj_freeze(mrb, copy);
return copy;
}
|
#to_s ⇒ String #inspect ⇒ String
Returns a string representation of Data
392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 |
# File 'mruby/mrbgems/mruby-data/src/data.c', line 392
static mrb_value
mrb_data_to_s(mrb_state *mrb, mrb_value self)
{
mrb_value members, ret, cname;
mrb_value *mems, *vals;
mrb_int mlen;
members = data_members(mrb, self);
mlen = RARRAY_LEN(members);
mems = RARRAY_PTR(members);
vals = RDATA_PTR(self);
ret = mrb_str_new_lit(mrb, "#<data ");
int ai = mrb_gc_arena_save(mrb);
cname = mrb_class_path(mrb, mrb_class_real(mrb_class(mrb, self)));
if (!mrb_nil_p(cname)) {
mrb_str_cat_str(mrb, ret, cname);
mrb_str_cat_lit(mrb, ret, " ");
}
for (mrb_int i=0; i<mlen; i++) {
mrb_int len;
const char *name = mrb_sym_name_len(mrb, mrb_symbol(mems[i]), &len);
if (i>0) mrb_str_cat_lit(mrb, ret, ", ");
mrb_str_cat(mrb, ret, name, len);
mrb_str_cat_lit(mrb, ret, "=");
mrb_str_cat_str(mrb, ret, mrb_inspect(mrb, vals[i]));
mrb_gc_arena_restore(mrb, ai);
}
mrb_str_cat_lit(mrb, ret, ">");
return ret;
}
|
#members ⇒ Array
Returns an array of strings representing the names of the instance variables.
Customer = Data.define(:name, :address, :zip)
joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
joe.members #=> [:name, :address, :zip]
90 91 92 93 94 |
# File 'mruby/mrbgems/mruby-data/src/data.c', line 90
static mrb_value
mrb_data_members(mrb_state *mrb, mrb_value obj)
{
return mrb_data_s_members(mrb, mrb_obj_value(mrb_obj_class(mrb, obj)));
}
|
#to_h ⇒ Hash
Create a hash from member names and values.
366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 |
# File 'mruby/mrbgems/mruby-data/src/data.c', line 366
static mrb_value
mrb_data_to_h(mrb_state *mrb, mrb_value self)
{
mrb_value members, ret;
mrb_value *mems, *vals;
members = data_members(mrb, self);
mems = RARRAY_PTR(members);
vals = RDATA_PTR(self);
ret = mrb_hash_new_capa(mrb, RARRAY_LEN(members));
mrb_int len = RARRAY_LEN(members);
for (mrb_int i=0; i<len; i++) {
mrb_hash_set(mrb, ret, mems[i], vals[i]);
}
return ret;
}
|
#to_s ⇒ String #inspect ⇒ String
Returns a string representation of Data
392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 |
# File 'mruby/mrbgems/mruby-data/src/data.c', line 392
static mrb_value
mrb_data_to_s(mrb_state *mrb, mrb_value self)
{
mrb_value members, ret, cname;
mrb_value *mems, *vals;
mrb_int mlen;
members = data_members(mrb, self);
mlen = RARRAY_LEN(members);
mems = RARRAY_PTR(members);
vals = RDATA_PTR(self);
ret = mrb_str_new_lit(mrb, "#<data ");
int ai = mrb_gc_arena_save(mrb);
cname = mrb_class_path(mrb, mrb_class_real(mrb_class(mrb, self)));
if (!mrb_nil_p(cname)) {
mrb_str_cat_str(mrb, ret, cname);
mrb_str_cat_lit(mrb, ret, " ");
}
for (mrb_int i=0; i<mlen; i++) {
mrb_int len;
const char *name = mrb_sym_name_len(mrb, mrb_symbol(mems[i]), &len);
if (i>0) mrb_str_cat_lit(mrb, ret, ", ");
mrb_str_cat(mrb, ret, name, len);
mrb_str_cat_lit(mrb, ret, "=");
mrb_str_cat_str(mrb, ret, mrb_inspect(mrb, vals[i]));
mrb_gc_arena_restore(mrb, ai);
}
mrb_str_cat_lit(mrb, ret, ">");
return ret;
}
|