Załóżmy, że mam funkcję zdefiniowaną w foo.m
. Ta funkcja może przyjmować parametr thing
typu struct
. Po wprowadzeniu foo
zmian w thing
, chcę "zablokować" thing
, aby nie można było już zmienić. W gruncie rzeczy chcę, żeby była stała. Chcę to zrobić, aby upewnić się, że nie zostanie zmodyfikowany w dalszej kolejności. Jak to zrobić w Matlab?Jak utworzyć stałą strukturę Matlaba po jej utworzeniu?
Odpowiedz
Rozwiązanie 1: Dobre, jeśli nie wiesz, co stanowić będzie miał swoją struct z góry
Mogłabyś „capture”, że zmienna z anonimową uchwytu funkcji i odnoszą się tylko do konstrukcji z tym od teraz na. Anonimowy uchwyt funkcji przechwytuje stan obszaru roboczego w momencie jego utworzenia. Będziesz mógł uzyskać dostęp do jego elementów tak, jakby był oryginalną strukturą, ale jeśli spróbujesz do tego przypisać, wygenerujesz błąd.
E.g.
>> S_.a = 1;
>> S_.b = 2;
>> S = @() S_;
>> S_.a = 3;
>> S_
S_ =
scalar structure containing the fields:
a = 3
b = 2
>> S()
ans =
scalar structure containing the fields:
a = 1
b = 2
To prawie identyczny w składni, z wyjątkiem irytacji, że będziesz musiał zadzwonić go ()
. Użyłem go na terminalu tutaj, ale oczywiście można go również łatwo wykorzystać w kontekście funkcji.
Małe zastrzeżenie; jeśli użytkownik ponownie zdefiniuje i nadpisze anonimową funkcję, oczywiście, ten backfires, ponieważ odziedziczy on każdą nową przestrzeń roboczą, do której miał dostęp w czasie redefinicji.
Rozwiązanie 2: Dobra, jeśli wiesz formularzu struct z wyprzedzeniem:
Załóżmy, z góry wiadomo, że struktura będzie zawierać tylko pola a
i b
. Utwórz klasę o tych samych właściwościach ograniczających "SetAccess", np.
classdef ConstStruct
properties (GetAccess = 'public', SetAccess = 'private')
a
b
end
methods
%constructor
function obj = ConstStruct(S)
obj.a = S.a;
obj.b = S.b;
end
end
end
Następnie w głównym kodzie:
>> MyStruct = struct('a',1,'b',2)
MyStruct =
a: 1
b: 2
>> MyStruct = ConstStruct(MyStruct)
MyStruct =
ConstStruct with properties:
a: 1
b: 2
>> MyStruct.a
ans =
1
>> MyStruct.a = 2
You cannot set the read-only property 'a' of 'ConstStruct'.
Należy
- zdefiniować zmienną w funkcji jako
persistent
- zablokować funkcję w pamięci przy użyciu
mlock
.
mlock
blokuje aktualnie działającą funkcję w pamięci, aby kolejne funkcje clear
nie usuwały jej. Zablokowanie funkcji w pamięci zapobiega także ponownemu inicjowaniu wszystkich stałych zmiennych zdefiniowanych w pliku.
inne rozwiązanie, jeśli jesteś szczęśliwy, aby użyć kodu obiektowego, jest, aby czynność funkcję członka, który inicjalizuje właściwość z atrybutem „stałej” –
faktycznie o tym myślę, myślę, że obaj źle zinterpretowaliśmy pytanie OP. Myślę, że są po "zablokowaniu" zmiennej, gdy wciąż znajdują się w pierwszym przejściu funkcji. –
Dobrze wiedzieć, +1, ale odpowiedź @Tasos Papastylianou była bliższa temu, czego szukałem. Nie wiedziałem o "mlocku"! – physmom
- 1. zmiana rozmiaru macierzy po jej utworzeniu w OpenCV
- 2. Jak utworzyć strukturę w JNA?
- 3. Błędy po utworzeniu apk
- 4. Jak utworzyć stałą stopkę w materiale angularjs
- 5. Czy można (ponownie) utworzyć plik PDB po utworzeniu biblioteki DLL?
- 6. Angular 2 Jak utworzyć strukturę zagnieżdżoną?
- 7. Jak mogę utworzyć zagnieżdżony skrót jako stałą w Perlu?
- 8. Jak utworzyć nową strukturę w Screeps
- 9. Jak utworzyć stałą stopkę w układzie Android?
- 10. Symfony3 ClassNotFoundException po utworzeniu wiązki
- 11. Jak wykonać skrypty po utworzeniu dokera?
- 12. Jak utworzyć strukturę rekursywną w ASP.NET MVC
- 13. Jak utworzyć strukturę, która zawiera własną listę?
- 14. Jak utworzyć strukturę z typu struct numba?
- 15. Jak utworzyć strukturę tabeli powiadomień na Facebooku?
- 16. Symlink zepsute zaraz po utworzeniu
- 17. UISearchDisplayController nie działa po utworzeniu w kodzie?
- 18. Jak zamknąć przeglądarkę po utworzeniu klasy C# WebClient?
- 19. Jak ustawić kod Matlaba?
- 20. Jak utworzyć instancję klasy z jej TRttiType?
- 21. TYPO3: Hak po utworzeniu lub edycji strony
- 22. Dlaczego folder nie istnieje po utworzeniu?
- 23. Wywołanie metody klasy po utworzeniu klas Pythona
- 24. NSManagedObject zachowują licznik jest 2 po utworzeniu
- 25. Rozpocznij pracę z Jennkin natychmiast po utworzeniu przez zadanie seedowania
- 26. Jak interpretować strukturę bez definicji?
- 27. Nawigacja po prawej stronie ze stałą pozycją?
- 28. Błąd AWS: "Odmowa dostępu" w CodeDeploy po utworzeniu przez Jenkinsa
- 29. Highcharts: jak ustawić nazwę etykiety legendy po utworzeniu wykresu?
- 30. OutOfMemoryError - jak zabić wirtualną maszynę wirtualną po utworzeniu hprof
@physmom Zaktualizowałem z bardziej eleganckim rozwiązaniem, zakładając, że znasz wcześniej formę swojej struktury. –
Naprawdę spróbuję tej metody "casting to object". Wydaje się to być bardzo zbliżone do tego, czego szukałem ... chociaż nie podoba mi się pomysł zdefiniowania gdzieś "lustrzanego" obiektu. – physmom
Dlatego użyłem tej samej nazwy zmiennej, aby nadpisać starą strukturę. Dobra praktyka programistyczna zwykle ostrzega przed tą samą zmienną trzymającą różne typy, ale myślę, że w tym przypadku możesz zrobić wyjątek :) –