mirror of
https://codeberg.org/andyscott/ziglings.git
synced 2024-12-22 06:03:09 -05:00
parent
4ce16782d0
commit
4eaef5fae4
2 changed files with 72 additions and 37 deletions
|
@ -40,12 +40,12 @@
|
|||
// (Notice how the two functions which return types start with
|
||||
// uppercase letters? This is a standard naming practice in Zig.)
|
||||
//
|
||||
const print = import(std).debug.print; // Oops!
|
||||
const print = @import("std").debug.print;
|
||||
|
||||
const Narcissus = struct {
|
||||
me: *Narcissus = undefined,
|
||||
myself: *Narcissus = undefined,
|
||||
echo: void = undefined,
|
||||
echo: void = undefined, // Alas, poor Echo!
|
||||
|
||||
fn fetchTheMostBeautifulType() type {
|
||||
return @This();
|
||||
|
@ -57,20 +57,26 @@ pub fn main() void {
|
|||
|
||||
// Oops! We cannot leave the 'me' and 'myself' fields
|
||||
// undefined. Please set them here:
|
||||
??? = &narcissus;
|
||||
??? = &narcissus;
|
||||
narcissus.me = &narcissus;
|
||||
narcissus.??? = ???;
|
||||
|
||||
// This determines a "peer type" from three separate
|
||||
// references (they just happen to all be the same object).
|
||||
const T1 = @TypeOf(narcissus, narcissus.me.*, narcissus.myself.*);
|
||||
const Type1 = @TypeOf(narcissus, narcissus.me.*, narcissus.myself.*);
|
||||
|
||||
// Oh dear, we seem to have done something wrong when calling
|
||||
// this function. It is namespaced to the struct, but doesn't
|
||||
// use the method syntax (there's no self parameter). Please
|
||||
// fix this call:
|
||||
const T2 = narcissus.fetchTheMostBeautifulType();
|
||||
// this function. We called it as a method, which would work
|
||||
// if it had a self parameter. But it doesn't. (See above.)
|
||||
//
|
||||
// The fix for this is very subtle, but it makes a big
|
||||
// difference!
|
||||
const Type2 = narcissus.fetchTheMostBeautifulType();
|
||||
|
||||
print("A {} loves all {}es. ", .{ T1, T2 });
|
||||
// Now we print a pithy statement about Narcissus.
|
||||
print("A {s} loves all {s}es. ", .{
|
||||
maximumNarcissism(Type1),
|
||||
maximumNarcissism(Type2),
|
||||
});
|
||||
|
||||
// His final words as he was looking in
|
||||
// those waters he habitually watched
|
||||
|
@ -121,7 +127,23 @@ pub fn main() void {
|
|||
// Alas, we can't use a regular 'for' loop here because
|
||||
// 'fields' can only be evaluated at compile time. It seems
|
||||
// like we're overdue to learn about this "comptime" stuff,
|
||||
// doesn't it? :-)
|
||||
// doesn't it? Don't worry, we'll get there.
|
||||
|
||||
print(".\n", .{});
|
||||
}
|
||||
|
||||
// NOTE: This exercise did not originally include the function below.
|
||||
// But a change after Zig 0.10.0 added the source file name to the
|
||||
// type. "Narcissus" became "065_builtins2.Narcissus".
|
||||
//
|
||||
// To fix this, I've added this function to strip the filename from
|
||||
// the front of the type name in the dumbest way possible. (It returns
|
||||
// a slice of the type name starting at character 14 (assuming
|
||||
// single-byte characters).
|
||||
//
|
||||
// We'll be seeing @typeName again in Exercise 070. For now, you can
|
||||
// see that it takes a Type and returns a u8 "string".
|
||||
fn maximumNarcissism(myType: anytype) []const u8 {
|
||||
// Turn '065_builtins2.Narcissus' into 'Narcissus'
|
||||
return @typeName(myType)[14..];
|
||||
}
|
||||
|
|
|
@ -1,26 +1,39 @@
|
|||
43c43
|
||||
< const print = import(std).debug.print; // Oops!
|
||||
---
|
||||
> const print = @import("std").debug.print;
|
||||
60,61c60,61
|
||||
< ??? = &narcissus;
|
||||
< ??? = &narcissus;
|
||||
---
|
||||
> narcissus.me = &narcissus;
|
||||
> narcissus.myself = &narcissus;
|
||||
71c71
|
||||
< const T2 = narcissus.fetchTheMostBeautifulType();
|
||||
---
|
||||
> const T2 = Narcissus.fetchTheMostBeautifulType();
|
||||
106c106
|
||||
< if (fields[0].??? != void) {
|
||||
---
|
||||
> if (fields[0].field_type != void) {
|
||||
110c110
|
||||
< if (fields[1].??? != void) {
|
||||
---
|
||||
> if (fields[1].field_type != void) {
|
||||
114c114
|
||||
< if (fields[2].??? != void) {
|
||||
---
|
||||
> if (fields[2].field_type != void) {
|
||||
--- exercises/065_builtins2.zig
|
||||
+++ answers/065_builtins2.zig
|
||||
@@ -58,7 +58,7 @@
|
||||
// Oops! We cannot leave the 'me' and 'myself' fields
|
||||
// undefined. Please set them here:
|
||||
narcissus.me = &narcissus;
|
||||
- narcissus.??? = ???;
|
||||
+ narcissus.myself = &narcissus;
|
||||
|
||||
// This determines a "peer type" from three separate
|
||||
// references (they just happen to all be the same object).
|
||||
@@ -70,7 +70,7 @@
|
||||
//
|
||||
// The fix for this is very subtle, but it makes a big
|
||||
// difference!
|
||||
- const Type2 = narcissus.fetchTheMostBeautifulType();
|
||||
+ const Type2 = Narcissus.fetchTheMostBeautifulType();
|
||||
|
||||
// Now we print a pithy statement about Narcissus.
|
||||
print("A {s} loves all {s}es. ", .{
|
||||
@@ -109,15 +109,15 @@
|
||||
// Please complete these 'if' statements so that the field
|
||||
// name will not be printed if the field is of type 'void'
|
||||
// (which is a zero-bit type that takes up no space at all!):
|
||||
- if (fields[0].??? != void) {
|
||||
+ if (fields[0].field_type != void) {
|
||||
print(" {s}", .{@typeInfo(Narcissus).Struct.fields[0].name});
|
||||
}
|
||||
|
||||
- if (fields[1].??? != void) {
|
||||
+ if (fields[1].field_type != void) {
|
||||
print(" {s}", .{@typeInfo(Narcissus).Struct.fields[1].name});
|
||||
}
|
||||
|
||||
- if (fields[2].??? != void) {
|
||||
+ if (fields[2].field_type != void) {
|
||||
print(" {s}", .{@typeInfo(Narcissus).Struct.fields[2].name});
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue